等待任务和任务有什么区别.结果

本文关键字:任务 区别 结果 什么 等待 | 更新日期: 2023-09-27 18:34:12

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

在上面的方法 return 语句中,我使用的是 Task<T>.Result 属性。

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会阻止它,那我不会错,对吗?

等待任务<T>和任务<T>有什么区别.结果

如果我认为 await 会释放调用线程但 Task.Result 会阻止它,我不会错,对吗?

一般来说,是的。 await task;将"产生"当前线程。 task.Result将阻止当前线程。 await是异步等待; Result是一个阻塞等待。

还有另一个更小的区别:如果任务以错误状态(即异常)完成,则await将按原样(重新)引发该异常,但Result会将异常包装在AggregateException中。

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

如果要执行动态任务并行性,则 ResultStartNew都是合适的;否则,应避免使用它们。如果您正在执行异步编程,则两者都不合适。

如果我认为 await 会释放调用线程但 Task.Result 会阻止它,我不会错,对吗?

你是对的,只要任务没有同步完成。如果是这样,使用 Task.Resultawait task 将同步执行,因为await将首先检查任务是否已完成。否则,如果任务尚未完成,它将阻塞调用线程Task.Result,而使用 await 将同步等待任务完成。另一个不同的是异常处理。前者将传播AggregationException(可能包含一个或多个异常),而后者将解开包装并返回基础异常。

作为旁注,通过同步方法使用异步包装器是一种不好的做法,应避免使用。此外,在异步方法中使用 Task.Result 是导致死锁的原因,也应避免。