在Singleton.Instance后面调用async方法

本文关键字:调用 async 方法 Singleton Instance | 更新日期: 2023-09-27 18:03:52

我有一个基本的单例类,但是单例有一个async方法,像这样:

public sealed class AddInHandler
{
    private static readonly AddInHandler instance = new AddInHandler();
    static AddInHandler()
    {
    }
    AddInHandler()
    {
    }
    public static AddInHandler Instance
    {
        get { return instance.Value; }
    }
    public async Task<AvailableActions> GetAvailableActions(string carrierMnemonic)
    {
        // some code that uses await...
    }
}

如果我尝试通过单例使用async方法,例如:

public async Task<Collection<CarrierInformation>> RetrieveAvailableCarriersAsync()
{
    // some await code here
    await Task.Run(() => 
    {
        // ...
        var availableActions = await AddInHandler.Instance.GetAvailableActions(addIn.Name);
    }
}

然后我点击错误。

await操作符只能在async lambda中使用表达式。考虑用'async'标记这个lambda表达式修饰符。

我期待这是因为实例属性不是异步的,我有这个问题?这是正确的吗?有没有推荐的解决这个问题的最佳方法?

在Singleton.Instance后面调用async方法

我期待它是因为实例属性不是异步的,我有这个问题吗?

不,您只是缺少了lambda表达式声明中的async修饰符。lambda本身必须标记为async,以便编译器在其中使用await:

await Task.Run(async () => 
{
    // ...
    var availableActions = await AddInHandler.Instance.GetAvailableActions(addIn.Name);
}

文档非常直接:

使用async修饰符指定方法、lambda表达式或匿名方法是异步的。如果在方法上使用此修饰符或者表达式,它被称为async方法。

如果你打电话

var availableActions = await AddInHandler.Instance.GetAvailableActions(addIn.Name);

在类型为new Action(() =>{});的表达式中,则需要异步修饰符。

new Action( async () =>
   {
      // some await code
   });