的任务.继续(在当前线程上)
本文关键字:前线 线程 任务 继续 | 更新日期: 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()
内部的代码强制使用当前线程,或者我做错了。
我需要的过程是:
- 在从服务器获取数据之前显示加载掩码
- 从服务器获取数据(可能需要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);
}));
});