我有一个具有纯静态方法和属性的类。我在类“Load”上调用异步方法,该方法向Web服务请求一大块数据,然后触发执行返回方法“LoadCompleted”的事件。我不知道调用要花多长时间(调用“Load”方法,然后调用“LoadCompleted”)之间的区别。
我想阻止应用程序继续进行,直到引发回调方法为止(因为应用程序将尝试从此类获取内容,在“LoadComplete”方法设置数据之前不会填充该内容)。 我该怎么做呢?
答案 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控件。这种方法不需要线程阻塞。