1

我必須使用.net 2.0時代.asmx Web服務,我沒有構建並且無法控制。然而,該服務是高度可用的,可以處理這一點。.net Web引用客戶端的正確多線程用法

我需要幫助的是客戶端,並使用visual studio生成的客戶端代理正確地從協調立場。目前我正在使用Web引用,但可以根據需要切換到服務引用。但我對WCF一無所知。

我讀得越多,我越迷惑自己。

我的具體問題:

鑑於生產方法的線沿線的一個Visual Studio生成的SOAP客戶端代理:

Foo(); 
FooAsync(); 
FooCompleted; 

Bar(); 
BarAsync(); 
BarCompleted; 
  1. 應當/我可以調用foo(),從多個線程,就像在Parallel.ForEach中一樣?
  2. 應該/我可以在並行foreach中調用FooAsync()嗎?這似乎是多餘的,因爲我已經在另一個線程?這樣做安全嗎?
  3. 應該/我可以在一個線程上調用FooAsync(),同時在另一個線程上調用BarAsync()?
  4. 這些生成的soap服務類似乎實現了EAP模式。我是pfx/tpl全新的東西,但我一直在研究任務,以更好地管理其中的一些內容。我已經看到了如何使用TaskCompletionSource使用Task來封裝EAP的示例。這是更好的方法嗎?

回答

2
  1. 你可以儘可能多的線程調用Foo()只要你想(你將不得不做出決定,你應該,自己是否有關)。他們運行(就像你所建議的),就好像他們並行運行一樣。

  2. 我提供了一個類似於您想要使用下面的任務並行庫(TPL)的示例。爲FooAsync()產生一個線程是多餘的,如果你已經爲Foo()產生了一個線程,但這取決於你正在做什麼或想做什麼。通常,您可以從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這完全是主觀的,取決於你想做什麼。就像回答1所建議的那樣,您可以根據需要在任意多個線程上調用這些方法中的每一個。

4 EAP模式see here的一個很好的例子。正如你將會看到的,它基本上就是我上面提供的。對於上述方法,我假設您想在完成FooAsync()BarAsync()之後運行'FooCompleted()and 'BarCompleted()。在這種情況下,我會說EPL模式正是你想要的。

我希望這會有所幫助。