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

C# 在Singleton.Instance后面调用异步方法,c#,asynchronous,singleton,async-await,task-parallel-library,C#,Asynchronous,Singleton,Async Await,Task Parallel Library,我有一个基本的singleton类,但singleton有一个异步方法,如下所示: public sealed class AddInHandler { private static readonly AddInHandler instance = new AddInHandler(); static AddInHandler() { } AddInHandler() { } public static AddInHandle

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

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...
    }
}
公共密封类AddInHandler
{
私有静态只读AddInHandler实例=新AddInHandler();
静态AddInHandler()
{
}
AddInHandler()
{
}
公共静态AddInHandler实例
{
获取{return instance.Value;}
}
公共异步任务GetAvailableActions(字符串载体Nemonic)
{
//一些使用wait的代码。。。
}
}
如果我尝试通过单例使用异步方法,例如:

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

    await Task.Run(() => 
    {
        // ...
        var availableActions = await AddInHandler.Instance.GetAvailableActions(addIn.Name);
    }
}
公共异步任务检索AvailableCarrierAsync()
{
//有些人在这里等待代码
等待任务。运行(()=>
{
// ...
var availableActions=await AddInHandler.Instance.GetAvailableActions(addIn.Name);
}
}
然后我打错了

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

new Action( async () =>
   {
      // some await code
   });
我认为这是因为实例属性不是异步的,所以我遇到了这个问题?这是正确的吗?有没有建议的解决这个问题的最佳方法

我期望它是因为实例属性不是异步的,所以我需要它 有这个问题吗

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

await Task.Run(async () => 
{
    // ...
    var availableActions = await AddInHandler.Instance.GetAvailableActions(addIn.Name);
}
这很直截了当:

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

如果你打电话

var availableActions = await AddInHandler.Instance.GetAvailableActions(addIn.Name);
在类型为
newaction(()=>{});
的表达式中,需要使用异步修饰符

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

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