我的应用程序使用以下代码安排长时间运行的任务:
Task.Factory.StartNew<bool>((a) => WorkTask1(),
TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent)
.ContinueWith(antecedent => WorkCompletedTask1(antecedent.Result),
TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)
WorkCompletedTask1已计划并按预期在UI上显示结果.根据WorkTask1的结果,WorkCompletedTask1可以使用以下语句安排其他任务:
Task.Factory.StartNew<bool>((a) => WorkTask2(),
TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent)
.ContinueWith(antecedent => WorkCompletedTask2(antecedent.Result),
TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)
WorkTask2不会按预期在单独的线程上运行; 它运行在UI线程上,该线程被阻塞直到WorkTask2完成.我认为TaskCreationOptions.LongRunning将保证一个单独的线程.
为什么这不起作用的任何建议?我可以从UI和非UI任务安排添加任务,而不是从UI中的.continuewith任务安排.
破碎的示例项目代码
在窗体上带有button1按钮的空Windows窗体项目中,此代码无法按预期工作(Windows 7 VS2010 Express Net 4.0).T2和T3在UI线程中运行,而不是工作线程.将listBox1添加到button1表单并尝试以下操作:
private delegate void DelegateSendMsg(String msg);
private DelegateSendMsg m_DelegateSendMsg;
private TaskScheduler uiSched;
private Process thisProcess;
private string
thisProcessName,
thisProcessId,
uiThreadName,
nonuiStatus = "Non-UI",
uiStatus = "UI";
private void Form1_Load(object sender, EventArgs e)
{
thisProcess = Process.GetCurrentProcess();
thisProcessName = thisProcess.ProcessName;
thisProcessId = thisProcess.Id.ToString();
uiThreadName = CurrentThread;
m_DelegateSendMsg = …Run Code Online (Sandbox Code Playgroud)