2016-05-23 72 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#中拍摄自己的最简单的方法一样。 –