我有一个基本的单例类,但是单例有一个像这样的异步方法:
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属性不是异步,我有这个问题吗?这是否正确,是否有建议的最佳解决方法?
答案 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
});