小编use*_*926的帖子

从UI调度任务的问题.继续任务

我的应用程序使用以下代码安排长时间运行的任务:

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)

c# task

4
推荐指数
1
解决办法
2802
查看次数

标签 统计

c# ×1

task ×1