2011-10-05 129 views
0

我需要四次調用WCF服務異步和線程安全與異步的東西和靜態方法總是煮我的大腦。TPL異步靜態方法調用線程安全

這四個對靜態方法的異步調用應該是線程安全的嗎?

private void CheckStuff() 
    { 
     bool? res1, res2, res3, res4; 

     // make 4 async calls to SomeServiceCall and wait for all 
     Task[] tasks = new Task[] 
          { 
           Task.Factory.StartNew(() => res1 = SomeServiceCall("apple")), 
           Task.Factory.StartNew(() => res2 = SomeServiceCall("orange")), 
           Task.Factory.StartNew(() => res3 = SomeServiceCall("apple")), 
           Task.Factory.StartNew(() => res4 = SomeServiceCall("banana")) 
          }; 
     Task.WaitAll(tasks); 
    } 

    private static bool? SomeServiceCall(string someParam) 
    { 
     bool? retVal = null; 

     var client = new SomeWcfClient(); 

     retVal = client.CheckSomething(someParam); 

     return retVal; 
    } 

回答

2

是 - 沒有共享狀態,所以應該沒有線程安全問題。 (編輯:正如在評論中指出,這是假設這沒關係,從多個線程同時訪問獨立 情況下,他們將不得不寫得不好的,要成爲一個問題。)

您可能會發現通道限於一次連接到同一個主機/端口的兩個連接,但這是一個單獨的問題,隻影響並行性,而不影響線程安全性。另外,在創建客戶端之前爲什麼要聲明返回變量併爲其分配一個永遠不會使用的值,並不是一成不變。較簡單的代碼:

private static bool? SomeServiceCall(string someParam) 
{ 
    var client = new SomeWcfClient(); 
    return client.CheckSomething(someParam); 
} 
+0

示例中沒有*顯式*共享狀態。不知道「SomeWcfClient」是幹什麼的。 –

+0

@JimMischel:嗯,這是真的 - 但如果兩個單獨的實例不能從單獨的線程調用,那麼真的所有的投注都關閉。如果代碼使用'SomeWpfClient'的單個實例,那麼這將是一個不同的問題。我希望*這段代碼沒問題。 –

+0

另外,由於它是一個WCF客戶端,並且*假設* SomeWcfClient是一個生成的代理,它應該被封裝在'using'語句中。 –

相關問題