我创建了一个可等待的基类来与
System.Windows.Input.ICommand
实例一起使用:
public class CommandContext
{
private SemaphoreSlim _busy { get; } = new SemaphoreSlim(0, 1);
public TaskAwaiter GetAwaiter() =>
_busy
.WaitAsync()
.GetAwaiter();
public void Release()=>_busy.Release();
}
ICommand
可以定义为:
public ICommand InitDBPIsCommand { get; private set; }
// Return 'void' not 'Task' as this will only be invoked through `ICommand`.
private async void onInitDBPIs(CommandContext context)
{
foreach (var dbpi in GetPrivsInUse())
{
await initDBPI(dbpi);
}
context.Release();
}
并实例化为:
InitDBPIsCommand = new Command<CommandContext>(onInitDBPIs);
这样做的目标是,因为几乎所有发生的事情都是
async
,所以有一个像这样典型的用法:
var context = new CommandContext();
Instance.InitDBPIsCommand?.Execute(context);
await context;
这一切都很棒,我现在希望能够在这个方案中使用
ConfigureAwait(true/false)
,但我不太清楚如何实现这一点。
这对你有用吗?
将其添加到您的班级
private bool _configureAwait = false;
然后提供一种设置该值的方法,可以通过构造函数或方法。
public CommandContext(bool configureAwait)
{
_configureAwait = configureAwait;
}
//or
public void SetConfigureAwait(bool value) => _configureAwait = value;
在你的方法中将其更改为
_busy.WaitAsync().ConfigureAwait(_configureAwait).GetAwaiter();
那么你就可以这样做
var context = new CommandContext(false);
// or
var context = new CommandContext();
context.SetConfigureAwait(false);
然后正常使用
await context;
即可