2012-11-13 181 views
0

假設你有ConcurrencyMode多VS異步/等待

[ServiceBehavior(
    IncludeExceptionDetailInFaults = true, 
    InstanceContextMode = InstanceContextMode.Single, 
    ConcurrencyMode = ConcurrencyMode.Multiple, 
    UseSynchronizationContext = false)] 

不使用這個實現下服務操作的異步/ AWAIT模式有什麼區別WCF服務?即使不使用異步/等待,服務調用也不會異步地執行並可能執行?即使閱讀了大量的msdn和博客文章,上述情況仍然不清楚,我會將我的操作異化爲安全。

回答

5

即使沒有使用async/await,服務調用是否會被彙集並可能異步執行?

編號ConcurrencyMode.Multiple將允許多個線程同時執行調用,但這不同於異步處理。

考慮一個單一的同步請求:單個線程將接收請求並一直執行直到它完成。如果該線程阻塞,那麼您有阻塞的線程等待該請求完成。您可以指定ConcurrencyMode.Multiple以允許其他線程進入並進行其他呼叫而不會阻止其他請求。

現在考慮一個單獨的異步請求:單個線程將接受請求並開始執行它。該線程將「等待」,而不是阻塞,這會將線程返回到線程池,直到異步操作完成。這意味着該請求上沒有阻塞線程。當方法在其await後恢復時,線程池中的某個線程將用於繼續請求(最終其中一個線程將完成請求)。

底線是服務器端的async允許比同步代碼更大的規模,因爲異步操作的開銷比線程低。

ConcurrencyMode處理一個不同的問題:它是關於您的服務實現是如何線程安全的。如果您可以同時有多個呼叫,則應指定ConcurrencyMode.Multiple。如果你有自然的異步操作,你應該使它們成爲async。如果你是線程安全的自然是異步的,你應該同時執行這兩個操作。