如何在自定义可等待类上配置Await

问题描述 投票:0回答:1

我创建了一个可等待的基类来与

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)
,但我不太清楚如何实现这一点。

c# async-await task maui
1个回答
2
投票

这对你有用吗?

将其添加到您的班级

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;
即可

© www.soinside.com 2019 - 2024. All rights reserved.