【发布时间】:2012-04-13 10:13:42
【问题描述】:
我想让result(繁重进程的返回结果)在额外线程中执行Heavy Process后可访问,因为它主要是预期不希望在进程UI生效期间,
进程完成后可以玩result
在一些搜索过程中,查看我的文章,我发现有 几种方法 实现这一点,请提供您知道或在类似情况下使用的最佳方法
这是我想以最佳方式处理的样本:
public ACollection DoProcess(Document docProcess)
{
ACollection result = new ACollection ();
ThreadStart threadStart = delegate
{
result = MyProcess(docProcess);
};
var threadProcess = new Thread(threadStart);
threadProcess.Start();
return result ;
}
其他可能的方法可能是 IAsyncResult、BackgroundWorker、使用计时器和检查状态,而不是将结果返回给处理它的方法并将其报告给 UI,以线程安全的方式将其直接发送到我们的 UI 控件。 ..
请在类似案例中给出您自己的意见和样本, 提前致谢
编辑 3:方法 - 基于 Brian 的回答
LenzCollection myResultCollection = new LenzCollection();
TaskScheduler ui = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() =>
{
myResultCollection = DoCollect(docProcess);
//Task.WaitAll();
return myResultCollection;
}).ContinueWith((task =>
{
myResultCollection = task.Result;
}), ui);
return myResultCollection;
它仍然没有等待,也不会给出想要的结果
【问题讨论】:
-
while (threadProcess.IsAlive) { }使这个单线程。还有一个 CPU 猪。 -
几分钟后我得到了编辑,谢谢,但仍然需要知道你建议的可重用方法,thx
-
BackgroundWorker 已经获得了您询问的所有功能。那么为什么要重新发明轮子呢?
-
为了让某些模块的编码风格与以前保持一致,并以这种方式使它们可重用,也许我错了,但我认为当你想使用 BackgrounndWorker 时,你的可重用性代码将被牺牲,我是对还是错?
-
这时候对我来说真的很难判断两个答案,我投票给每个参与者,关于选择的答案我会在测试 Tigran 的方法后决定,这对我来说是新的,我也喜欢 Raphael 的回答,因为 Events 是我的朋友,并且实施很好,并且为您提供了所需的灵活性,我应该去并会在 2-3 小时后返回,并会使用建议的方法,看看在这种情况下哪种方法最好,谢谢大家,真的很有帮助....
标签: c# multithreading