2016-05-23 71 views
1

以下代碼有一個錯誤:result不包含任何狀態; IsCompleted,IsCanceledIsFaulted總是假的,但我測試Task工作正常,哪裏有問題?任務不返回IsCompleted狀態

var result = _dataService.SyncPoll(webApiPoll); 

if (result.IsCompleted) 
{ 
    _logger.Info("Execute sync, poll was completed"); 
    poll.IsSynchronized = true; 
    poll.ServerStatus = ServerStatus.Active; 
    ctx.SaveChanges(); 
} 

////// 

public Task SyncPoll(PollDto poll) 
{ 
    if (!_isAuthorized) 
    { 
     return null; 
    } 
    var client = new ApiClient(_baseApiUrl, _authToken); 
    Task result = Task.Run(async() => await client.SyncPollWeb(poll)); 
    return result; 
} 

/////// 

public async Task<HttpResponseMessage> SyncPollWeb(PollDto poll) 
{ 
    HttpResponseMessage resp; 
    //System.Diagnostics.Debugger.Launch(); 
    using (var client = GetClient()) 
    { 
     client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(_authType, _accessToken); 
     resp = await client.PostAsJsonAsync<PollDto>("api/poll", poll); 
    } 
    return resp; 
} 
+1

您在檢查這些狀態之前是否等待任務完成?從你的代碼中,我看不到這些。當任務正在運行時,所有這三個狀態當然都是「錯誤」的。 –

+0

您需要等待結果返回的任務。它將*異步*完成,因此在您檢查時幾乎不會完成。 –

回答

2

你實際上是做一個fire and forget所以你不要有來自await 你有這樣的原則

問題狀態添加等待以便返回狀態

var result = await _dataService.SyncPoll(webApiPoll); 

//和這裏

Task result = await client.SyncPollWeb(poll); 
+0

這是等待異步任務的正確方法,或者甚至可以使用Task.WhenAll,然後等待調用層 –

+0

哦,現在我明白了,謝謝=)但是在這個解決方案中錯過了一些東西,我們應該改變方法返回類型 –

+0

是的,只是省略了task.run答案已更新 –

0

發生這種情況是因爲當您檢查狀態時,您的任務尚未完成(並正在運行) - 您只需創建它。您應該等到任何狀態爲您的任務deternined。檢查result.IsCompleted

之前使用

result.Wait(); 

+2

在WebApi Wait/WaitAll會導致死鎖,你需要WhenAll或者簡單的等待,檢查http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html –

+0

謝謝,看來就像在C#中拍攝自己的最簡單的方法一樣。 –