如何在Silverlight中异步运行多个UI动作
本文关键字:UI 动作 运行 异步 Silverlight | 更新日期: 2023-09-27 18:13:55
我看到了什么
这篇文章展示了如何异步运行多个任务并等待所有任务。解决方案如下:
var thread1 = new Thread(() => DoSomething(1, 0));
var thread2 = new Thread(() => DoSomething(2, 3));
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
但似乎这些任务都是非ui任务。我有同样的问题,但与UI任务。如果你想在WPF/Silverlight中做与ui相关的任务,你应该使用Dispatcher
,所以我尝试了这个代码:
Thread GetThread(Action action)
{
return new Thread(()=>
{
Application.Current.RootVisual.Dispatcher.BeginInvoke(()=>
{
action();
});
});
}
我是这样使用它的:
var thread1=GetThread(async ()=>{UIProperty1 = await GetUIPropertyValuesFromWebServiceAsync1();});
var thread2=GetThread(async ()=>{UIProperty2 = await GetUIPropertyValuesFromWebServiceAsync2();});
thread1.Start();
thread2.Start();
但是会抛出这个异常
无效的跨线程访问。
如何更正此代码以异步运行多个ui相关任务?我也在寻找最佳实践。
编辑#1:为什么我使用线程如果我使用这种方法:
UIProperty1 = await GetUIPropertyValuesFromWebServiceAsync1(); // Call some web service
UIProperty2 = await GetUIPropertyValuesFromWebServiceAsync2(); // Call some web service
这些方法将被一个接一个地调用,我更喜欢同时调用它们(有两个以上的web服务调用)
编辑#2:为什么我不使用taskkey。P_5不需要线程,特别是当您需要操作UI元素时。如果您希望同时调用这两个方法,您可以使用Microsoft.Bcl.Async
:
TaskEx.WhenAll
。public async void SomeEventHandler(object sender, EventArgs e)
{
var firstUiProperty = GetUIProperty1Async();
var secondUiProperty = GetUIProperty2Async();
await TaskEx.WhenAll(firstUiProperty, secondUiProperty);
}