4

我遇到了以下代码,它使用 ContinueWith() 来等待结果。

public async Task<User> GetUser()
{
    return await _serviceRepo.GetUserAsync()
       .ContinueWith(task => 
       {
           return task.Result;
       });
}

是否ContinueWith()阻塞调用线程直到任务从GetUserAsync()调用返回?

由于在task.Result计划的 ContinueWith() 内,在等待前件时是否有任何阻塞task

我在其他几个地方看到过这种类型的代码,这是否被认为是异步/等待模式的最佳实践?我希望GetUserAsync()调用返回结果而不是使用 aContinueWith()等待它。

4

1 回答 1

6

是否ContinueWith()阻塞调用线程直到任务从GetUserAsync()调用返回?

不,线程不会被阻塞,因为这是一个async操作。请注意,给定的代码等待的不是任务,而是continuation,这可能会在调试过程中误导您。

由于在计划task.Result的内部ContinueWith(),在等待前面的任务时是否有任何被阻塞的东西?

不,任务已经完成,不会阻塞当前线程。但是,如果任务未成功完成,则会引发异常。

这被认为是异步/等待模式的最佳实践吗?

不,这段代码可以改写为:

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;
}
于 2017-12-14T21:36:40.963 回答