这个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相关的任务?我也在寻找最佳实践。
如果我使用这种方法:
UIProperty1 = await GetUIPropertyValuesFromWebServiceAsync1(); // Call some web service
UIProperty2 = await GetUIPropertyValuesFromWebServiceAsync2(); // Call some web service
这些方法将一个接一个地调用,我更喜欢同时调用它们(有两个以上的Web服务调用)
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;
答案 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);
}