【问题标题】:Task.Factory.StartNew not starting?Task.Factory.StartNew 没有启动?
【发布时间】:2013-05-10 02:51:59
【问题描述】:

我正在尝试前往网关,获取数据然后返回 UI 线程。 ContinueWith 运行,但网关从不运行??

ILogonResult result;

Task.Factory
.StartNew(() =>
    {
        result = Gateway.Authenticate(a, b);
    })
.ContinueWith(task =>
    {
        TaskScheduler.FromCurrentSynchronizationContext();
        DoSomeUI(result);
    }
);

【问题讨论】:

  • 这里的上下文放错地方了,应该是ContinueWith中的参数...
  • 我在这里看到了很多问题,但没有足够的信息来回答您的问题。 1)您不应该在任务中设置result 变量,您应该返回结果;然后继续可以从task.Result 读取值。 2)你的fromUIContext放错地方了;您希望它作为 ContinueWith 的第二个参数,以使继续在 UI 线程中运行。 DoSomeUI 也应该作为参数给出任务的结果。另外,Result 的类型是什么?在不知道 Authenticate 会发生什么的情况下很难说。
  • 另外,我要用我的通灵调试技术说resultTask<T>,你开始一个任务就开始一个任务;它在您完成启动任务时完成,而不是在它启动的任务实际完成时完成,这就是继续似乎立即运行的原因。
  • @BahaiResearch.com 这不是特别有用。 ILogonResult 是什么?是代表认证的异步完成,还是包含认证的实际结果?
  • 您的TaskScheduler.FromCurrentSynchronizationContext() 在这段代码中没有任何用处。

标签: c# multithreading task-parallel-library


【解决方案1】:

试一试,您似乎只是希望执行 Gateway.Authenticate 方法并将该结果类型返回给更新您的 UI 的方法。

Task.Factory
.StartNew(() =>
{
    return Gateway.Authenticate(a, b);
})
.ContinueWith((t) =>
{
    if (t.Exception == null)
    {
       DoSomeUI(t.Result);
    }else{
       //Handle Exception Message
    }
}
);

【讨论】:

  • 虽然这肯定是一种更好的实践方式,正如我在对问题本身的评论中所描述的那样,它在功能上是相同的。如果 OP 中的代码不起作用,那么这也不起作用。
  • 我不认为这是相同的,因为我正在对 Task 参数的 result 属性进行操作,这意味着它将尝试运行任务并在继续之前获得结果可以发生。在 OP 中,他只是在 start new 中设置结果,但 continuewith 没有使用 Task 参数的任何属性,因此它将继续并触发。结果只是一个变量,虽然它没有初始化,但它有一个类型。 Continuewith 只会看到它调用该方法并传递一个空结果。
  • 这是对ContinueWith 的调用,而不是对StartNew 的第二次调用。延续不会开始运行,直到它正在继续的任务完成执行。 这就是延续的全部意义;如果它在它正在继续的任务完成之前运行,它根本就没有任何用途!它是否使用它继续的任务的任何属性都没有关系。
  • 我在阅读后误解了我理解你的意思,我对正在发生的事情的理解有些困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
相关资源
最近更新 更多