在Singleton.Instance后面调用异步方法

时间:2015-07-22 08:15:54

标签: c# asynchronous singleton async-await task-parallel-library

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

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...
    }
}

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

public async Task<Collection<CarrierInformation>> RetrieveAvailableCarriersAsync()
{
    // some await code here

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

然后我遇到了错误。

  

等待&#39;运算符只能在异步lambda中使用   表达。考虑使用&#39; async&#39;标记这个lambda表达式。   改性剂。

我期待它,因为Instance属性不是异步,我有这个问题吗?这是否正确,是否有建议的最佳解决方法?

2 个答案:

答案 0 :(得分:4)

  

我期待它是因为Instance属性不是我的异步   遇到这个问题?

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

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

The documentation非常简单:

  

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

答案 1 :(得分:2)

如果你正在打电话

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

new Action(() =>{});类型的表达式中,您需要async修饰符。

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