如何在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

如何在Silverlight中异步运行多个UI动作

不需要线程,特别是当您需要操作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);
}