阻止.Net中的线程

时间:2010-08-13 13:53:28

标签: c# vb.net multithreading silverlight asynchronous

我有一个具有纯静态方法和属性的类。我在类“Load”上调用异步方法,该方法向Web服务请求一大块数据,然后触发执行返回方法“LoadCompleted”的事件。我不知道调用要花多长时间(调用“Load”方法,然后调用“LoadCompleted”)之间的区别。

我想阻止应用程序继续进行,直到引发回调方法为止(因为应用程序将尝试从此类获取内容,在“LoadComplete”方法设置数据之前不会填充该内容)。 我该怎么做呢?

3 个答案:

答案 0 :(得分:6)

应避免在极端偏见的情况下阻止主UI线程。

我会使用Silverlight Toolkit中的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上的用户输入而不会阻塞主线程,并使用一些反馈来说明为什么他们现在无法点击任何内容。您可以使用BustContent属性为忙碌消息提供自己的内容。当然,如果你不喜欢它的外观,你可以根据自己的喜好设计它。

如果要获取所有MVVM,可以将IsBusy属性绑定到VM属性,该属性指示VM现在不需要任何更改。

答案 1 :(得分:2)

如果需要,可以使用ManualResetEvent类来阻止主线程。只需调用WaitOne方法来阻止并在asyc web请求完成时调用Set方法解除阻塞。请注意,如果您阻止主UI线程,整个应用程序将完全没有响应。

答案 2 :(得分:1)

您可以考虑在开始时将UI控件设置为禁用。在加载完成后,您可以显示数据,然后启用UI控件。这种方法不需要线程阻塞。