在Silverlight UI线程中,在做InvokeAsync时会发生什么?

时间:2011-07-07 12:17:12

标签: multithreading silverlight

我正在尝试解决SL性能问题。 到目前为止,我有一些由InvokeAsync执行的WCF调用。 现在,我将其更改为使用BackgroundWorker。 性能大大提高。

是什么原因引起的? InvokeAsync究竟做了哪些影响UI线程?它是否打开另一个UI线程?

由于

2 个答案:

答案 0 :(得分:4)

归结为同步上下文。线程可以与SynchronizationContext相关联,例如DispatcherSynchronizationContext(这是UI线程的上下文,只包含这一个线程)。 WCF将在它开始的同一个同步上下文中完成一个操作,如果没有与该线程关联的同步上下文,它将使用线程池中的任何线程。

因此,如果您从UI线程调用了几个未完成的异步操作,那么所有这些操作都希望在UI线程中运行它们的完成代码。如果其中一些完成代码同时完成,则必须排队等待将其分派到此单个UI线程中。

然而,当您在后台工作程序中调用异步操作时,它在线程池中的线程中运行,并且没有特殊的同步上下文。当这些操作完成它们的完成代码时,可以在池中的任何可用线程上运行(其中有几个)。因此,几乎同时完成的所有完成都可以在不同的线程上并行运行。

答案 1 :(得分:0)

在WPF和Silverlight中,我建议使用SynchronazationContext来保存主线程,所有其他线程将使用SynchronazationContext的这个实例来访问主线程(UI)。您以这种方式使用它(注意:我生成了一个执行此操作的方法,所有其他方法将访问此方法以更新UI):

SynchronazationContext ctx = null;
void DoSomething()
{
    ctx = SynchronazationContext.Current;
    //Some algorithm here
    this.UpdatePic("Success !");
}
void ThreadProc()
{
    SendOrPostCallback callBack  = new SendOrPostCallback(UpdatePic);
    ctx.Post(callBack, String.Format("Put here the pic path");
}
void UpdatePic(string _text)
{  
    //This method run under the main method
}

在.NET 5.0中,您可以通过将方法标记为async来调用此复杂函数,并在调用同步方法时编写'await' - 将同步方法作为异步方法并使用主线程更新UI。