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

时间:2015-09-21 11:06:24

标签: c# multithreading silverlight asynchronous async-await

我所看到的

这个post显示了如何异步运行多个任务并等待所有这些任务。这是解决方案:

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:为什么我不使用TaskEx.WhenAll方法

var task1 = GetUIPropertyValuesFromWebServiceAsync1(); // Call some web service
var task2 = GetUIPropertyValuesFromWebServiceAsync2(); // Call some web service

TaskEx.WhenAll(task1, task2); // it seems this line never finishes!

UIProperty1 = task1.Result; //never reaches this line
UIProperty2 = task2.Result;

1 个答案:

答案 0 :(得分:3)

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