异步发送主线程信号

Fra*_*del 1 c# multithreading

我可能会犯这个错误,但我被困住了.我有一个GUI应用程序,它产生一个单独的线程,从服务器下载一堆数据.当这个下载线程完成时,我希望它向主线程发送一个信号,以便它知道它现在可以显示下载的数据.

我已经尝试调用Invoke(从我的主窗体)调用委托来进行显示工作,但这会阻止我的下载程序线程直到完成.我有点想在没有EndInvoke的情况下做一个BeginInvoke,但我知道它不适合这样做.

Ree*_*sey 6

有几个选择.

我个人最喜欢的是使用TPL.在您的UI线程上,您可以创建一个TaskFactory,如下所示:

// Given:
// TaskFactory uiFactory;

uiFactory = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)

然后,在后台任务中,您可以创建一个Task更新UI:

var task = uiFactory.StartNew( () => UpdateUserInterface(data));
Run Code Online (Sandbox Code Playgroud)

这将正确编组UI线程,类似于BeginInvoke调用.如果需要阻止,可以调用task.Wait()(或者task.Result如果Update方法返回值).