我被困在一个可能是概念性的问题或者我想念的简单问题上。我有一个桌面应用程序正在对服务器进行异步调用。
这涉及到多个类的多个嵌套调用。我一直把它保持在调用链的整个过程中。
我能够始终如一地重现的主要问题是当我将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上找到任何相关的帖子,并没有找到任何具体的相关信息。
谢谢!
答案 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或服务器本身的任何异步代码无关。