在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表达式修饰符。
我期待这是因为实例属性不是异步的,我有这个问题?这是正确的吗?有没有推荐的解决这个问题的最佳方法?
我期待它是因为实例属性不是异步的,我有这个问题吗?
不,您只是缺少了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
});