2010-08-13 214 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控件。这种方法不需要线程阻塞。