簡體   English   中英

在等待的任務上使用ContinueWith()並在里面調用Task.Result

[英]Using ContinueWith() on an awaited task and calling Task.Result inside

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM