【问题标题】:Calling async method behind Singleton.Instance在 Singleton.Instance 后面调用异步方法
【发布时间】:2015-10-11 23:58:23
【问题描述】:

我有一个基本的单例类,但单例有一个异步方法,如下所示:

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);
    }
}

然后我遇到了错误。

“await”运算符只能在异步 lambda 中使用 表达。考虑用“异步”标记这个 lambda 表达式 修饰符。

我期待这是因为 Instance 属性不是异步的,所以我遇到了这个问题?这是否正确,是否有推荐的最佳方法来解决此问题?

【问题讨论】:

  • 请显示您的通话的完整上下文。您只能在异步函数中使用 await - 异步方法或异步 lambda 表达式。我强烈怀疑这就是问题所在。
  • 我认为它在抱怨包装此代码的方法 var availableActions = await AddInHandler.Instance.GetAvailableActions(addIn.Name);。该方法需要标记为异步

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


【解决方案1】:

我期待这是因为我的 Instance 属性不是异步的 有这个问题吗?

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

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

The documentation 非常简单:

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

【讨论】:

    【解决方案2】:

    如果你打电话来

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      相关资源
      最近更新 更多