C# 如何在Silverlight中异步运行多个UI操作? 我所看到的

C# 如何在Silverlight中异步运行多个UI操作? 我所看到的,c#,multithreading,silverlight,asynchronous,async-await,C#,Multithreading,Silverlight,Asynchronous,Async Await,这显示了如何异步运行多个任务并等待所有任务。以下是解决方案: 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/S

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

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方法
不需要线程,特别是当您需要对UI元素进行操作时。 如果您希望同时调用这两种方法,则可以从以下位置使用
TaskEx.whalll


不需要线程,特别是当您需要对UI元素进行操作时。 如果您希望同时调用这两种方法,则可以从以下位置使用
TaskEx.whalll


不需要线程,特别是当您需要对UI元素进行操作时。 如果您希望同时调用这两种方法,则可以从以下位置使用
TaskEx.whalll


不需要线程,特别是当您需要对UI元素进行操作时。 如果您希望同时调用这两种方法,则可以从以下位置使用
TaskEx.whalll




这些任务将要做什么?他们是否真的有一个异步操作要调用,还是您只想更新一个UI元素?如果是后者,为什么要使用任务或线程呢?是的,它们使用。有一些方法,比如
GetUIProperty1
,它们是异步方法,我想将它们的结果设置为一些属性。(实际上这些方法调用了一些webservices方法)那么为什么需要线程呢?为什么不在一些事件处理程序中调用它们并对它们执行
await
?它们返回
Task
,如果我使用
await
关键字,就会一个接一个地调用它们。我还尝试调用它们并使用了TaskEx。whalll但没有成功。您想同时调用这些任务吗?这些任务将做什么?他们是否真的有一个异步操作要调用,还是您只想更新一个UI元素?如果是后者,为什么要使用任务或线程呢?是的,它们使用。有一些方法,比如
GetUIProperty1
,它们是异步方法,我想将它们的结果设置为一些属性。(实际上这些方法调用了一些webservices方法)那么为什么需要线程呢?为什么不在一些事件处理程序中调用它们并对它们执行
await
?它们返回
Task
,如果我使用
await
关键字,就会一个接一个地调用它们。我还尝试调用它们并使用了TaskEx。whalll但没有成功。您想同时调用这些任务吗?这些任务将做什么?他们是否真的有一个异步操作要调用,还是您只想更新一个UI元素?如果是后者,为什么要使用任务或线程呢?是的,它们使用。有一些方法,比如
GetUIProperty1
,它们是异步方法,我想将它们的结果设置为一些属性。(实际上这些方法调用了一些webservices方法)那么为什么需要线程呢?为什么不在一些事件处理程序中调用它们并对它们执行
await
?它们返回
Task
,如果我使用
await
关键字,就会一个接一个地调用它们。我还尝试调用它们并使用了TaskEx。whalll但没有成功。您想同时调用这些任务吗?这些任务将做什么?他们是否真的有一个异步操作要调用,还是您只想更新一个UI元素?如果是后者,为什么要使用任务或线程呢?是的,它们使用。有一些方法,比如
GetUIProperty1
,它们是异步方法,我想将它们的结果设置为一些属性。(实际上这些方法调用了一些webservices方法)那么为什么需要线程呢?为什么不在一些事件处理程序中调用它们并对它们执行
await
?它们返回
Task
,如果我使用
await
关键字,就会一个接一个地调用它们。我还尝试调用它们并使用了
TaskEx.WhenAll
,但没有成功。您想同时调用这些任务吗?silverlight中没有
Task.WhenAll
。我想异步调用多个web服务,然后将其结果设置为UI的某个属性。所以我很想知道你的方法的内部,例如
getuipropertyasync()
方法。它与你的
GetUIProperty1
方法相同。您只需返回要从方法中设置的内容。还需要添加
GetUIPropertyValuesFromWebServiceAsync1
GetUIPropertyValuesFromWebServiceAsync2
方法。另外,您没有在
TaskEx上使用
wait
。whalll
。是的,在
TaskEx
之前使用
wait
。但是没有必要添加这些方法,因为我已经添加了它们。在silverlight中没有
任务。当所有的
都在silverlight中时。我想异步调用多个web服务,然后将它们的结果设置为UI的某个属性。所以我很想知道你的方法的内部,例如
getuipropertyasync()
方法。它与你的
GetUIProperty1
方法相同。您只需返回要从方法中设置的内容。还需要添加
GetUIPropertyValuesFromWebServiceAsync1
GetUIPropertyValuesFromWebServiceAsync2
方法。另外,您没有在
TaskEx上使用
wait
。whalll
。是的,在
TaskEx
之前使用
wait
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;
public async void SomeEventHandler(object sender, EventArgs e)
{
    var firstUiProperty = GetUIProperty1Async();
    var secondUiProperty = GetUIProperty2Async();
    await TaskEx.WhenAll(firstUiProperty, secondUiProperty);
}