的任务.继续(在当前线程上)

本文关键字:前线 线程 任务 继续 | 更新日期: 2023-09-27 18:03:18

我有一个方法,代码如下:

object frm = null;
// shows the overlay loading mask
Core.ShowLoadingMask("Please wait...");
// start task
Task.Factory.StartNew(() => {
    // go to server and get the data
    var employee = new Data.Entities.Employee(employeeId);
    // instantiate the class type (reflection)
    frm = Activator.CreateInstance(type, employee );
}).ContinueWith((task) => {
    // hide loading mas
    Core.HideLoadingMask();
    if (frm != null) this.Panel.Controls.Add(frm);
});

那么,我怎么能强迫ContinueWith()内部的代码强制使用当前线程,或者我做错了。

我需要的过程是:

  1. 在从服务器获取数据之前显示加载掩码
  2. 从服务器获取数据(可能需要3秒)
  3. 然后退出任务并隐藏加载掩码。

什么线索吗?

的任务.继续(在当前线程上)

Pass TaskScheduler.FromCurrentSynchronizationContext() to ContinueWith()

.ContinueWith((task) => {
    // hide loading mas
    Core.HideLoadingMask();
    if (frm != null) this.Panel.Controls.Add(frm);
}, TaskScheduler.FromCurrentSynchronizationContext());

假设this也是一个UI控件,您可以在启动任务之前使用this.Dispatcher存储当前的调度程序。然后在ContinueWith中,使用存储调度程序执行隐藏操作。看到Dispatcher.BeginInvoke。

Dispatcher dispatcher = this.Dispatcher;
Core.ShowLoadingMask("Please wait...");
return Task.Factory.StartNew(() =>
{
    doStuff();
    frm = ...
}).ContinueWith(t =>
{
    dispatcher.BeginInvoke(new Action(() =>
    {
        Core.HideLoadingMask();
        if (frm != null) this.Panel.Controls.Add(frm);
    }));
});