在等待的任务上使用 ContinueWith(),并在内部调用 Task.Result



我遇到了以下使用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;
}

最新更新