【发布时间】:2011-07-25 18:00:44
【问题描述】:
背景:我曾经在表单加载期间调用存储过程。然而,由于这导致了次优的 UI 体验,我将我的 SP 调用放在了 Shown 事件中它自己的任务中。由于这通常是表单显示过程中的最后一个事件,因此与将内容放入表单加载事件相比,它产生了更好的体验。我有:
private void MainForm_Shown(object sender, EventArgs e)
{
dbCheckTask = Task<bool>.Factory.StartNew(RunSPAndCheckStuff());
// both of below run on the GUI thread.
// if I print the thread ID in mycallback it is the GUI thread id
dbCheckTask.ContinueWith(mycallback());
// I also tried below. But obviously, that too runs on the GUI thread
mycallback(dbCheckTask.Result)
}
因为它们在 GUI 线程上触发,所以我的启动表单绘制仍然既不瞬时也不流畅。如何在不诉诸事件的情况下在非 GUI 线程上获得任务完成回调?每当任务完成并且如果出现问题并且仅在出现问题时(布尔结果返回 false),用户就会弹出一个消息框。在那之前,他可以继续在表单上做其他与数据库无关的事情。请告知我如何在非 gui 线程中获得任务完成回调和任务结果。谢谢
【问题讨论】:
-
这在我看来应该已经可以工作了——你能发布 mycallback() 方法的代码或伪代码吗?
-
我相信您可以使用 TaskScheduler.Default 来获取未绑定到同步上下文的调度程序。您看到这个问题的事实表明 TaskScheduler.Current 在某些时候被设置为同步任务调度程序。
-
@Stuart。如果其他人对此问题的建议不起作用,将发布一些示例代码。谢谢
-
@Dan 感谢您的提示。我没有使用任务调度程序设置任何内容。代码就像我所展示的那样。也会看那个角度。
标签: c# multithreading .net-4.0 task-parallel-library