2013-01-21 25 views
0

我有一个带有几个进度条的主线程。每个进度条都是DataTable读数的进度,所以我有6个不同变量的进度条(DataTable dt1, ... dt2, ... dt3, ...),这是疼痛开始的地方。从线程到主线程的交叉结果

我一直在使用任务,线程,BackgroundWorker的,等等,我无法找到一个干净的方式:

  • 选择信息的位置读取
  • 负载Async上的主要进展螺纹
  • 返回读DataTable并将其存储在各自的dt

我有做到了:

Task t = Task.Factory.StartNew(new Action(() => 
     { 
      dt1 = customProgress.Read<DataTable>("Path"); 
     })); 

编辑:我的问题很混乱,事实上。我将重写它:

是否有更有效的方法来通过线程交叉这种信息或创建一个变量来等待MainThread运行时的结果?

+0

我不明白。你想要在后台线程上执行代码,但是你不想指定代码应该在后台线程上执行? – svick

+0

'Task.Factory.StartNew()'是将该操作放在线程池上,以便它异步运行并且不会阻塞main。如果你删除它,那么它会阻止main()直到它完成。你可以删除'new Action()',因为它知道如何适当地建立一个lambda,但如果你想异步运行,其余部分是必须的。 – Despertar

+3

你真的认为这是完成这么复杂任务的代码量过大吗?如果这对你来说是一个漫长而乏味的代码,那么你将会在编程生涯中遇到一些真正的困难。 – Servy

回答

0

不需要等待主线程阻塞UI。相反,您可以在使用Task.Factory.ContinueWhenAll()方法完成所有任务时设置延续。如果你想在UI线程上运行这个延续,那么传递scheduler参数为TaskScheduler.FromCurrentSynchronizationContext()