2010-08-13 153 views
3

我有一個具有純靜態方法和屬性的類。我在類「Load」上調用一個異步方法,它向Web服務請求一大塊數據,然後觸發執行返回方法「LoadCompleted」的事件。我不知道調用需要多長時間(調用「Load」方法,然後調用「LoadCompleted」)之間的區別。在.Net中阻塞線程

我想阻止應用程序繼續進行下去,直到回調方法被提出爲止(因爲應用程序會嘗試從該類中獲取東西,直到「LoadComplete」方法設置數據纔會填充該東西) 。 我會如何去做這件事?

+6

所以,你使用的異步方法,需要阻止一切,直到它完成...?我肯定誤解了你,對吧? – GenericTypeTea 2010-08-13 13:56:29

+0

你會認爲你不會。但是,不,你是對的。它需要異步調用Web服務,因此我別無選擇。 – Ben 2010-08-13 13:59:07

+0

爲什麼只需要調用Web服務即可實現異步?我只在Silverlight客戶端中熟悉這一限制。 – 2010-08-13 14:03:34

回答

6

阻止主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現在不需要更改任何內容。

2

如果需要,可以使用ManualResetEvent類來阻塞主線程。只需調用WaitOne方法即可阻止並調用Set方法以在asyc Web請求完成時解除阻止。請注意,如果您屏蔽了主UI線程,您的整個應用程序將完全無響應。

1

您可以考慮將UI控件設置爲在開始時禁用。在加載完成後,您可以顯示數據,然後啓用UI控件。這種方法不需要線程阻塞。