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<HttpResponseMessage> 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 一个任务只有在它处于完成状态时才能被释放的主要内容,如果未能解决你的问题,请参考以下文章