我遇到了以下使用ContinueWith()等待结果的代码。
public async Task<User> GetUser()
{
return await _serviceRepo.GetUserAsync()
.ContinueWith(task =>
{
return task.Result;
});
}
ContinueWith()
阻止调用线程,直到任务从GetUserAsync()
调用返回?
由于task.Result
位于已安排的ContinueWith()内,是否在等待前一个task
时被阻止?
我在其他几个地方看到过这种类型的代码,这被认为是async / await模式的最佳实践吗?我希望GetUserAsync()
调用返回结果而不是使用ContinueWith()
等待它。
答案 0 :(得分:3)
ContinueWith()
阻止调用线程,直到任务从GetUserAsync()
调用返回?
不,线程不会被阻止,因为这是一个async
操作。请注意,给定的代码不是等待任务,而是延续,这可能会在调试期间误导您。
由于
task.Result
位于预定的ContinueWith()
内,是否在等待前期任务时被阻止?
不,任务已经完成,当前线程也不会被阻止。但是,如果任务未成功完成,则会引发异常。
这被认为是asyn / await模式的最佳实践吗?
不,这段代码可以用以下形式重写:
public async Task<User> GetUser()
{
return await _serviceRepo.GetUserAsync();
}
但是,如果继续有一些逻辑,就像这样:
public async Task<User> GetUser()
{
return await _serviceRepo.GetUserAsync()
.ContinueWith(task =>
{
// do something with the result, for example, log the success
return task.Result;
});
你可以这样做:
public async Task<User> GetUser()
{
var user = await _serviceRepo.GetUserAsync();
// do something with the result, for example, log the success
return user;
}