我遇到了以下使用ContinueWith()等待结果的代码。
public async Task<User> GetUser()
{
return await _serviceRepo.GetUserAsync()
.ContinueWith(task =>
{
return task.Result;
});
}
ContinueWith()
是否阻止调用线程,直到任务从GetUserAsync()
调用返回?
由于task.Result
位于计划的 ContinueWith() 中,因此在等待先行task
时是否有任何内容被阻止?
我已经在其他几个地方看到了这种类型的代码,这被认为是异步/等待模式的最佳实践吗? 我希望GetUserAsync()
调用返回结果,而不是使用ContinueWith()
来等待它。
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;
}