2010-01-12 35 views
0

大家都知道,在Silverlight中,所有wcf服務調用都是異步的。但是,我們可以說什麼要求的時間?對於下面的代碼,服務器在「Hello B」之前是否會收到「Hello A」?Silverlight中wcf調用的時間

ServiceClient proxy = new ServiceClient();
ServiceClient proxy2 = new ServiceClient();

proxy.SayHelloAsync(「Hello A」);
proxy2.SayHelloAsync(「Hello B」);

我反覆運行代碼,服務器總是先收到「Hello A」。它只是運氣好嗎?

回答

0

是的,如果你有兩個異步調用,你可以讓他們中的任何一個先完成。

如果您需要任何等待完成,你應該看看上WaitHandle

0

這只是運氣。我已經運行了幾乎完全相同的測試,並以各種不同的順序完成測試。在真實場景中尤其如此,您可能會同時發生大量未完成的呼叫(例如,在聊天應用程序中)。如果你需要調用A在調用B之前完成,你需要以某種方式鏈接它們,並且這樣做的機制都不是很乾淨。根據我的經驗,使用某種WaitHandle的建議可能很危險。你的里程可能會有所不同,但我發現如果你不是很小心,使用WaitHandle來管理WCF調用的時間可以阻止關鍵線程的運行。使用「A」完成時調用的方法調用「B」會更好,但更復雜。

+0

我同意你對WaitHandle的分析,它需要更多的關心。在很多情況下,你可能是正確的,但是如果兩個調用可以並行運行,那麼鏈接可能會更好。在專門分配的後臺線程上使用幾個等待句柄(即沒有別的關鍵待辦事項的線程)應該相當簡單。 – AnthonyWJones 2010-01-12 20:49:57

+0

這也是我的理解,但我也知道Silverlight偶爾會通過將WCF調用封送到UI線程中來做一些奇怪的事情。最後一次嘗試通過使用帶有ManualResetEvent的僞同步模式來簡化我的代碼時,我無法使其可靠工作:調用將永遠不會返回。但我不記得我正在採取的確切方法,而對線程問題了解比我更多的人可能會有更好的運氣:-)。 – 2010-01-12 22:07:48

相關問題