WCF HandleError System.InvalidOperationException只有在任务处于完成状态

时间:2017-05-10 00:59:59

标签: c# multithreading wcf asynchronous asynchttpclient

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

这涉及到多个类的多个嵌套调用。我一直把它保持在调用链的整个过程中。

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

代码段不是正确的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(Boolean excludeInput)      WCF HandleError - System.InvalidOperationException:只有在任务处于完成状态(RanToCompletion,Faulted或Cancelled)时才可以处置该任务。    在System.Threading.Tasks.Task.Dispose(布尔处理)    在System.Threading.Tasks.Task.Dispose()    在System.ServiceModel.Dispatcher.MessageRpc.DisposeParametersCore(Boolean excludeInput)      WCF HandleError - System.InvalidOperationException:只有在任务处于完成状态(RanToCompletion,Faulted或Cancelled)时才可以处置该任务。    在System.Threading.Tasks.Task.Dispose(布尔处理)    在System.Threading.Tasks.Task.Dispose()    在System.ServiceModel.Dispatcher.MessageRpc.DisposeParametersCore(Boolean excludeInput)

在最终服务中制作Async Post时,我一直都会遇到此错误。我只是不确定它是否相关,或者是某种种族关系。任何有关异步信息的帮助或链接都非常感谢。我试图在SO上找到任何相关的帖子,并没有找到任何具体的相关信息。

谢谢!

2 个答案:

答案 0 :(得分:0)

请确保以下内容:

async方法定义

中的

PostCore

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

和&#39;等待&#39; SendAsync调用

return await _httpClient.SendAsync(dto);

希望这有帮助!

答案 1 :(得分:0)

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

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