WCF HandleError System.InvalidOperationException 一个任务只有在它处于完成状态时才能被释放

Posted

技术标签:

【中文标题】WCF HandleError System.InvalidOperationException 一个任务只有在它处于完成状态时才能被释放【英文标题】:WCF HandleError System.InvalidOperationException A task may only be disposed if it is in a completion state 【发布时间】:2017-10-08 11:36:38 【问题描述】:

我被困在一个可能是概念性的问题或我遗漏的简单问题上。我有一个桌面应用程序正在对服务器进行异步调用。

这涉及通过多个类进行多次嵌套调用。我在整个调用链中一直保持异步。

我能够始终如一地重现的主要问题是,当我将 HTTP 客户端传递给另一个生成异步 Post 的服务时。

代码 sn-ps 不是 %100 正确的,只是试图显示基本的

 public async Task<bool> SomeTask(IEnumerable<Dto> dtoList)
    

           var response = await _corepointService.PostCore(request, _idbContext);
            if (response.StatusCode == HttpStatusCode.BadRequest)
            
                success = false;
            
        
        return success;
    


 public Task<HttpResponseMessage> PostCore(Dto request, IDBContext 
                    dbContext, HttpClient _httpClient)
    

        var dto = new HttpRequestMessage
        
            RequestUri = new Uri(request.Resource),
            Method = HttpMethod.Post,
            Content = new StringContent(request.Body, Encoding.UTF8,
                "application/json")
        ;

        return _httpClient.SendAsync(dto);
    

这是我尝试过的另一种选择,不是传入 HttpClient 并创建一个新的。

 public Task<HttpResponseMessage> PostCore(Dto request, IDBContext 
                    dbContext)
    
        var _httpClient = new HttpClient();
        var dto = new HttpRequestMessage
        
            RequestUri = new Uri(request.Resource),
            Method = HttpMethod.Post,
            Content = new StringContent(request.Body, Encoding.UTF8,
                "application/json")
        ;

        return _httpClient.SendAsync(dto);
    

我得到的错误是

 WCF HandleError - System.InvalidOperationException: A task may only be disposed if it is in a completion state (RanToCompletion, Faulted or Canceled).

在 System.Threading.Tasks.Task.Dispose(布尔处理) 在 System.Threading.Tasks.Task.Dispose() 在 System.ServiceModel.Dispatcher.MessageRpc.DisposeParametersCore(布尔排除输入) WCF HandleError - System.InvalidOperationException:只有处于完成状态(RanToCompletion、Faulted 或 Canceled)的任务才能被释放。 在 System.Threading.Tasks.Task.Dispose(布尔处理) 在 System.Threading.Tasks.Task.Dispose() 在 System.ServiceModel.Dispatcher.MessageRpc.DisposeParametersCore(布尔排除输入) WCF HandleError - System.InvalidOperationException:只有处于完成状态(RanToCompletion、Faulted 或 Canceled)的任务才能被释放。 在 System.Threading.Tasks.Task.Dispose(布尔处理) 在 System.Threading.Tasks.Task.Dispose() 在 System.ServiceModel.Dispatcher.MessageRpc.DisposeParametersCore(Boolean excludeInput)

在最终服务中进行异步发布时,我一直收到此错误。我只是不确定它是否相关,或者是某种种族关系。非常感谢任何有关异步信息的帮助或链接。我试图在 SO 上找到任何相关的帖子,但没有找到任何与此相关的具体内容。

谢谢!

【问题讨论】:

您是否在实际代码中将您的 PostCore 方法标记为异步?你在等待 SendAsync 电话吗? return await _httpClient.SendAsync(dto);public async Task&lt;HttpResponseMessage&gt; PostCore(... @WhiteRuski 我没有将 PostCore 方法标记为异步并等待 SendAsync 调用。我认为通过返回一个具有 HttpResponseMessage 类型的任务就足够了。不过我可以试试这个!谢谢:) 将其添加为带有一些格式/等的答案,以让其他人更容易找到它:) 【参考方案1】:

请确保以下几点:

async 中的PostCore 方法定义

public async Task<HttpResponseMessage> PostCore(Dto request,
    IDBContext dbContext, HttpClient _httpClient)

并“等待”SendAsync 调用

return await _httpClient.SendAsync(dto);

希望这会有所帮助!

【讨论】:

【参考方案2】:

这是由桌面客户端中的包装类引起的,该类正在返回一个任务并期望它等待的方法是同步的。

它与 HttpPost 或服务器本身中的任何异步代码无关。

【讨论】:

以上是关于WCF HandleError System.InvalidOperationException 一个任务只有在它处于完成状态时才能被释放的主要内容,如果未能解决你的问题,请参考以下文章

服务边界处的 WCF 错误日志记录

IErrorHandler

MVC3 HandleError 不显示错误页面

HandleError Attribute

使用全局日志记录时,MVC [HandleError] HandleErrorAttribute 调用了两次

工作流服务中 HandleError 与 ProvideFault 不一致,如何处理?