我有一個具有純靜態方法和屬性的類。我在類「Load」上調用一個異步方法,它向Web服務請求一大塊數據,然後觸發執行返回方法「LoadCompleted」的事件。我不知道調用需要多長時間(調用「Load」方法,然後調用「LoadCompleted」)之間的區別。在.Net中阻塞線程
我想阻止應用程序繼續進行下去,直到回調方法被提出爲止(因爲應用程序會嘗試從該類中獲取東西,直到「LoadComplete」方法設置數據纔會填充該東西) 。 我會如何去做這件事?
我有一個具有純靜態方法和屬性的類。我在類「Load」上調用一個異步方法,它向Web服務請求一大塊數據,然後觸發執行返回方法「LoadCompleted」的事件。我不知道調用需要多長時間(調用「Load」方法,然後調用「LoadCompleted」)之間的區別。在.Net中阻塞線程
我想阻止應用程序繼續進行下去,直到回調方法被提出爲止(因爲應用程序會嘗試從該類中獲取東西,直到「LoadComplete」方法設置數據纔會填充該東西) 。 我會如何去做這件事?
阻止主UI線程應該避免極端的偏見。
我會用從Silverlight工具包的BusyIndicator
控制: -
<UserControl x:Class="StackoverflowSpikes.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit">
<toolkit:BusyIndicator x:Name="busyInd" >
<Grid x:Name="LayoutRoot">
<!-- The rest of your content -->
</Grid>
</toolkit:BusyIndicator>
</UserControl>
調用Load
使用前: -
busyInd.IsBusy = true;
然後LoadComplete
用途: -
busyInd.IsBusy = false;
這將鎖定UI上的用戶輸入而不阻止主要的t並提供一些反饋意見,說明爲什麼他們現在不能點擊任何內容。您可以使用BustContent
屬性爲繁忙消息提供自己的內容。當然,如果你不喜歡它的外觀,你可以根據自己的喜好來設計它。
如果您想要獲取所有MVVM,您可以將IsBusy
屬性綁定到VM屬性,該屬性指示VM現在不需要更改任何內容。
如果需要,可以使用ManualResetEvent類來阻塞主線程。只需調用WaitOne方法即可阻止並調用Set方法以在asyc Web請求完成時解除阻止。請注意,如果您屏蔽了主UI線程,您的整個應用程序將完全無響應。
您可以考慮將UI控件設置爲在開始時禁用。在加載完成後,您可以顯示數據,然後啓用UI控件。這種方法不需要線程阻塞。
所以,你使用的異步方法,需要阻止一切,直到它完成...?我肯定誤解了你,對吧? – GenericTypeTea 2010-08-13 13:56:29
你會認爲你不會。但是,不,你是對的。它需要異步調用Web服務,因此我別無選擇。 – Ben 2010-08-13 13:59:07
爲什麼只需要調用Web服務即可實現異步?我只在Silverlight客戶端中熟悉這一限制。 – 2010-08-13 14:03:34