1

빌드하지 않고 제어 할 수없는 .net 2.0 시대의 .asmx 웹 서비스를 사용해야합니다. 그러나이 서비스는 가용성이 높으며이를 처리 할 수 ​​있습니다..Net 웹 참조 클라이언트의 적절한 다중 스레드 사용

내가 도움이 필요한 것은 클라이언트이며 Visual Studio를 사용하여 concurency 스탠드 지점에서 클라이언트 프록시를 올바르게 생성했습니다. 현재 웹 참조를 사용하고 있지만 필요한 경우 서비스 참조로 전환 할 수 있습니다. 하지만 WCF에 대해서는 아무 것도 모른다.

내가 읽는 것이 많을수록 더 혼란 스럽습니다.

내 특정 질문 :

감안할의 라인을 따라 방법을 생산하는 비주얼 스튜디오 생성 비누 클라이언트 프록시 :

Foo(); 
FooAsync(); 
FooCompleted; 

Bar(); 
BarAsync(); 
BarCompleted; 
  1. 해야/i를 하나 개 이상의 스레드에서 푸()를 호출 할 수 있습니다 , Parallel.ForEach 에서처럼?
  2. 병렬 foreach 내부에서 FooAsync()를 호출 할 수 있습니까? 이미 다른 스레드에 있기 때문에 중복되는 것 같습니다. 이것을하는 것이 안전합니까?
  3. 한 스레드에서 FooAsync()를 호출해야합니까? 또 다른 스레드에서 BarAsync()를 호출해야합니까?
  4. 생성 된 SOAP 서비스 클래스는 EAP 패턴을 구현하는 것으로 보입니다. 나는 pfx/tpl에 새로운 브랜드이지만,이 중 일부를 더 잘 관리 할 수있는 방법으로 작업을보고있다. TaskCompletionSource를 사용하여 Task로 EAP를 래핑하는 방법의 예를 보았습니다. 그게 더 나은 접근 방법인가요?

답변

2
  1. 당신이 원하는만큼 스레드에서 Foo()를 호출 할 수 있습니다 (당신은 결정 여부는 해야, 자신에 관한해야 할 것이다). 그들은 마치 그들이 평행하게 달리고있는 것처럼 당신이 제안한 것처럼 달립니다.

  2. 아래의 작업 병렬 라이브러리 (TPL)을 사용하여 원하는 것의 예제를 제공했습니다. 이미 Foo()에 대한 스레드를 생성 한 경우 FooAsync()에 대한 스레드를 생성하는 것은 불필요하지만 수행중인 작업이나 수행하려는 작업에 따라 다릅니다. 일반적으로 UI 스레드에서 Foo()을 호출하면 차례로 FooAsync()이 별도의 스레드에서 실행됩니다.

    private void Foo() 
    { 
        // Get TaskScheduler to facilitate manipulation of GUI on UI Thread. 
        TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 
    
        // Cancellation support. 
        CancellationTokenSource cancelSource = new CancellationTokenSource(); 
        CancellationToken token = cancelSource.Token; 
    
        // Spin-off onto background thread. 
        Task<bool> asyncFooTask = null; 
        asyncFooTask = Task.Factory.StartNew<bool>(() => asyncFoo(uiScheduler, token, _dynamic), token); 
    
        // Continuation/call-back/error-handling. 
        asyncTask.ContinueWith(task => 
        { 
         // Check task status. 
         switch (task.Status) 
         { 
          // Handle any exceptions to prevent UnobservedTaskException.    
          case TaskStatus.RanToCompletion: 
           if (asyncTask.Result) 
            // Success. Do stuff. 
           else 
            // Failed. Do stuff. 
           break; 
          case TaskStatus.Canceled: 
           if (task.Exception != null) 
            // Cancelled with exception. 
           else 
            // User cancelled. 
           break; 
          case TaskStatus.Faulted: 
           if (task.Exception != null) 
            // AggregateException thrown by antecident. 
           else 
            // Task failed... 
           break; 
         } 
         return; 
        }, TaskScheduler.FromCurrentSynchronizationContext()); 
    } 
    

은 TPL 및 그 사용에 큰 도입이 link를 참조하십시오. 또한 일반 스레딩 (및 다른 내용)에 대한 자세한 내용은 J. Albahari's Threading Page을 참조하십시오.

3 이것은 전적으로 주관적이며 원하는 작업에 따라 다릅니다. Answer 1이 암시 하듯이, 당신은 원하는만큼 많은 스레드에서이 메소드들을 호출 할 수 있습니다.

4 EAP 패턴 see here의 좋은 예입니다. 보시다시피, 그것은 본질적으로 위에 제공된 것입니다. 위의 방법에 대해서는 FooAsync()BarAsync()이 완료된 후 'FooCompleted() and 'BarCompleted()'을 실행한다고 가정합니다. 이 경우 EPL 패턴이 원하는대로 정확하게 표현됩니다.

이 정보가 도움이되기를 바랍니다.

관련 문제