c# - await Task<T> 和 Task<T>.Result 有什么区别?

标签 c# multithreading async-await

public async Task<string> GetName(int id)
{
    Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id));
    return nameTask.Result;
}

在上面的方法返回语句中,我使用了 Task<T>.Result属性(property)。

public async Task<string> GetName(int id)
{
     Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id));
     return await nameTask;
}

这里我用的是await Task<T> .如果我认为 await 将释放调用线程但我不会错 Task<T>.Result会阻止它,对吗?

最佳答案

I wont be wrong if I think that await will release the calling thread but Task.Result will block it, would it be right?

一般来说,是的。 await task; 将“让出”当前线程。 task.Result 将阻塞当前线程。 await 是异步等待; Result 是阻塞等待。

还有另一个更细微的区别:如果任务在故障状态下完成(即有异常),那么 await 将按原样(重新)引发该异常,但是 结果 会将异常包装在 AggregateException 中。

作为旁注,避免 Task.Factory.StartNew。它几乎从来都不是正确的使用方法。如果您需要在后台线程上执行工作,请选择 Task.Run

ResultStartNew 都是合适的,如果你正在做 dynamic task parallelism ;否则,应避免使用它们。如果您正在做 asynchronous programming,两者都不合适.

关于c# - await Task<T> 和 Task<T>.Result 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27464287/

相关文章:

c# - asp.net 中的日志记录和错误处理

c# - 无法在 UI 上以编程方式选中或取消选中 DataGridViewCheckBoxColumn 单元格

c# - .NET Entity Framework 与复制的 SQL 服务器的使用

multithreading - TThread.OnTerminate执行线程

c# - 使用 await 关键字实现游戏脚本的协程

javascript - 异步等待不等待对象填充 axios.get

c# - 应用当前值时 Entity Framework 更新问题

客户端/服务器 pthreads 程序未在 Valgrind 下执行。正常运行

python - 无法打开由 Python 中的线程创建的管道描述符

javascript - 如何解决异步函数中的 promise ?