【发布时间】:2015-12-07 17:13:41
【问题描述】:
此异步方法产生两个 CS0165 错误 - 使用未分配的局部变量。
public async Task<Tuple<bool, string>> DoWorkAsync(object[] objs)
{
string msg;
bool result;
await Task.Run(() => result = _foo.DoWork(objs, out msg));
return new Tuple<bool, string>(result, msg);
}
最初我想问为什么,但现在我很确定这是因为本地任务中可能会引发异常。
请参阅下面魔术师 Jon Skeet 的评论:编译器不知道 Task.Run 在做什么,也无法推断将分配本地人。
所以现在我要问:实现这一点的最佳方法是什么?为本地分配默认值,为任务创建本地并检查任务。返回前是否出现错误?
我一般应该传播异常吗?我想这可能是一个无法回答的问题,具体取决于上下文。
【问题讨论】:
-
对于初学者,不要使用
Task.Run来伪造异步。 -
这不是因为可能引发异常,而是因为 C# 编译器不知道
Task.Run的作用。就它而言,这只是一种任意方法。 -
这解释了为什么不应该为同步方法公开异步包装器:blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx
-
@Michael:不,它不能。想象一下,你在那里打电话给
Foo.Bar而不是Task.Run- 你认为这应该改变吗?想象一下Foo.Bar只是一个返回Task<int>的方法,从未执行过委托。
标签: c# async-await