在等待的任务上使用ContinueWith()并在

时间:2017-12-11 04:10:42

标签: c# async-await task task-parallel-library continuewith

我遇到了以下使用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()等待它。

1 个答案:

答案 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;
}