[英]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.