此异步方法生成两个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.IsFaulted?
我通常应该传播异常吗?我认为根据具体情况,这可能是一个无法回答的问题。
答案 0 :(得分:3)
从Tuple
返回Task.Run
,如下所示:
public Task<Tuple<bool, string>> DoWorkAsync(object[] objs)
{
return Task.Run(() =>
{
string msg;
var result = _foo.DoWork(objs, out msg);
return new Tuple<bool, string>(result, msg);
});
}
现在您不必担心未初始化的局部变量。