2012-11-08 2 views
4

다음 예제에서는 메서드가 WCF 서비스 작업으로 노출되어 IIS에서 서비스가 호스팅됩니다. 함수에 입력하면 WebOperationContext.Current가 예상대로 설정됩니다. 그러나 기다리기 대기가 끝나면 WebOperationContext.Current는 null로 설정됩니다.비동기 WCF 메서드 대기중인 후 WebOperationContext가 null입니다.

 public async Task TestAsync() 
    { 
     //WebOperationContext.Current is set 

     Task t = new Task(()=>Thread.Sleep(10000)); 

     t.Start(); 

     await t; 

     //WebOperationContext.Current is null 
    } 

이 단점이 될 것 같다, 그래서 사람이 알고 있었다 궁금하고 주변에 어떤 좋은 방법이 있다면. 지역 변수에서 컨텍스트에 대한 참조를 캐싱 할 수 있다는 것을 알았지 만, 좋지는 않습니다. 작동

업데이트

한 가지 방법은 다른 사람이 암시 한대로, 내가 할 수있는, 또한

  public async Task TestAsync() 
    { 
     WebOperationContext ctx = WebOperationContext.Current; 

     Task t = new Task(()=>Thread.Sleep(10000)); 

     t.Start(); 

     await t; 

     //ctx is set   
    } 

이며이

 public async Task TestAsync() 
    { 
     CallContext.LogicalSetData("WebOperationContext.Current", WebOperationContext.Current); 

     Task t = new Task(()=>Thread.Sleep(10000)); 

     t.Start(); 

     await t; 

     WebOperationContext ctx = (WebOperationContext)CallContext.LogicalGetData("WebOperationContext.Current"); 
    } 

성능면에서 의미가 될 것입니다 무엇 및 각각의 스레드 안전성?

답변

4

WCF 팀이 OperationContext.Current에 대한 솔루션을 고려하고 있으며, 그들이 WebOperationContext.Current을 처리 할 것으로 예상되는 것으로 들었습니다. this SO post (Jon Cole은 MS WCF 팀에 있음)을 참조하십시오.

한편, 변수의 값을 캡처하여 (테스트 가능성이 향상되고 내가 추천 한 것입니다) LogicalCallContext에 추가하거나 SynchronizationContext을 설치하십시오 (IIS에서 호스팅되기 때문에 까다로울 수 있음). 자체는 SynchronizationContext)를 사용합니다.

+0

나는이 게시물을 보았지만 JC가 팀에 있다는 사실을 깨닫지 못해서 다시 물어볼 것이라고 생각했다. 다음과 같은 코드 블록이 다른 스레드에서 실행될 것이라는 점을 감안할 때, 어떤 속임수가 관련 될지는 모르겠지만, 수정을위한 좋은 후보자처럼 보일 것입니다. –

+0

WCF는 호스트 중립적이기 때문에 복잡성이 있습니다. 'await'은 "컨텍스트"에서 캡처하고 재개 할 것입니다. 그러나 이것은 대개 WCF가 아니라 호스트에 의해 결정되는 (그리고 컨텍스트와 함께 전달할 자신의 데이터를 삽입하는 "후크"가없는) SynchronizationContext입니다. 'LogicalCallContext'는 WCF 팀이 항상 그것을 사용하고 원격 호출과 다른 appdomain으로 넘칠 수있는 경우 상당히 중요한 성능을 발휘합니다). 그래서 나는 그들이 그것을 어떻게 해결할 것인지를 모른다. ;) –

+0

변수에서 값을 캡처하는 가장 좋은 방법은 로컬 참조를 저장하고 이것을 사용하는 것이 안전한지, 아니면 더해야합니까? –