2017-05-10 8 views
1

개념적이거나 문제가 될 수있는 문제가 있습니다. 서버에 대한 비동기 호출을하는 데스크탑 응용 프로그램이 있습니다.WCF HandleError System.InvalidOperationException 작업이 완료 상태에있는 경우에만 처리 ​​할 수 ​​있습니다.

여기에는 여러 클래스를 통해 여러 개의 중첩 호출이 포함됩니다. 나는 그것을 호출 체인 전체에서 비동기로 유지했다.

일관되게 재현 할 수 있었던 주요 문제는 HTTP 클라이언트를 비동기 게시를 만드는 다른 서비스에 전달할 때입니다.

코드 조각 그냥

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); 
    } 

이 내가 시도 다른 대안이 기본 보여 주려 그대로 수정 100 % 아니다는 HttpClient를을 passingin하고 새로 만들 수 없습니다.

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); 
    } 

내가 점점 오전 오류는 시스템에서 System.Threading.Tasks.Task.Dispose() 에서 (폐기 부울) System.Threading.Tasks.Task.Dispose 에서

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

입니다 .ServiceModel.Dispatcher.MessageRpc.DisposeParametersCore (Boolean excludeInput) WCF HandleError - System.InvalidOperationException : 완료 상태 (RanToCompletion, Faulted 또는 Cancelled)에있는 경우에만 작업을 삭제할 수 있습니다. System.ServiceModel.Dispatcher.MessageRpc.DisposeParametersCore (부울 excludeInput) WCF는 handleError에서 System.Threading.Tasks.Task.Dispose() 에서 System.Threading.Tasks.Task.Dispose (폐기 부울) 에서 - System.InvalidOperationException : 완료 상태 (RanToCompletion, Faulted 또는 Cancelled)에있는 경우에만 작업을 삭제할 수 있습니다. System.ServiceModel.Dispatcher.MessageRpc.DisposeParametersCore에서 System.Threading.Tasks.Task.Dispose() 에서 System.Threading.Tasks.Task.Dispose (폐기 부울) (부울 excludeInput)에서

나는 consistenly입니다 비동기 포스트가 최종 서비스에서 작성 될 때이 오류가 발생합니다. 나는 그것이 심지어 관련이 있는지 또는 어떤 종류의 인종 관계인지 확실하지 않습니다. 비동기 정보에 대한 도움이나 링크는 많은 도움이됩니다. 나는 관련 게시물을 찾으려고 노력해 왔으며 이것에 관해 특별히 발견하지 못했습니다.

감사합니다.

asyncPostCore 방법 정의

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

와 '기다린다'는가 SendAsync 호출이 도움이

return await _httpClient.SendAsync(dto); 

희망 :

+0

실제 코드에서 PostCore 메서드를 async로 표시 했습니까? SendAsync 호출을 기다리고 있습니까? – WhiteRuski

+0

@WhiteRuski PostCore 메서드를 비동기로 표시하지 않고 SendAsync 호출을 기다렸습니다. 다음과 같이 작업을 반환하여 생각했습니다. (예 : _httpClient.SendAsync (dto);와 public 비동기 작업 PostCore 고마워요 :) – beckish

+0

다른 사람들이 쉽게 찾을 수 있도록/etc 일부 서식을 사용하여 답변을 추가했습니다. :) – WhiteRuski

답변

0

이것은 데스크톱 클라이언트에서 작업을 반환하고 그것이 동기를 기다리고있는 메서드를 기대하고있는 래퍼 클래스에 의해 발생했습니다.

HttpPost 또는 서버 자체의 비동기 코드와 관련이 없습니다.

0

는 다음과 같은 확인하십시오!