在分配本地之前从异步方法返回

时间:2015-12-07 17:13:42

标签: c# async-await

此异步方法生成两个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?

我通常应该传播异常吗?我认为根据具体情况,这可能是一个无法回答的问题。

1 个答案:

答案 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);
    });
}

现在您不必担心未初始化的局部变量。