本文介绍了如何让我在后台运行的非必要的计算?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这个问题将在后续。我意识到,我的真正的问题是一个比在该职位上一个台阶。下面的问题我现在问,是我怎么做到这一点?
我想用并发在C#来计算在后台的东西。我有类ptsTin,它代表一个现有的地面。我想使装载尽可能快。有些工作是必要的,直到工作完成后,你没有一个实例。例如,没有ptsTin实例直到.LoadPoints()和.LoadTriangles都是完整
的
工作的其他部分不是必需的,并且可以购买计算机,甚至如果以后为0.2秒后。我想先从非必要的工作在一个新的线程,并忘掉它。如果这是工作的价值还没有准备好,该值将只是空。
因此,这里是我想做些什么。现在的代码是在一个控制台应用程序,但有一天会在一个GUI应用程序。请注意,这是的伪代码的。我知道它不会像这样工作,其目的是为了沟通,我想知道怎么做的:
静态无效主要(字串[] args)
{
VAR myTin = ptsDTM.Load(SomeFile.ptsTin);
//这里做其他的东西像getElevationAtAPoint();
}
公共静态ptsTin负荷(字符串文件)
{
//基础工作
ptsTin newTin =新ptsTin();
newTin.LoadPoints(文件);
newTin.LoadTriangles(文件);
//在这一点上,我可以回来,但我想其他的东西做
//非必要的工作 - 我想这一个后台任务
newTin。 BoundingBox的= newTin.ComputeBBInTheBackground();
//现在返回,而不等待ComputeBB完成
返回newTin;
}
如果其他方法后要求tin.BoundingBox,但价值还没有准备好然而,它仍然是空。其他方法会知道的值是有效的,当它不为空。
我如何做到这一点?
我没有偏爱的答案是否使用异步和等待,Task.Run,或任何其他的办法。
解决方案
You can do this by changing BoundingBox
to a Task<BoundingBox>
which will be completed in the future.
public static ptsTin Load(String file)
{
// Essential Work
ptsTin newTin = new ptsTin();
newTin.LoadPoints(file);
newTin.LoadTriangles(file);
// At this point I could return, but I want other stuff done
// Non-essential work -- I want this on a "background" task
newTin.BoundingBox = Task.Run(() => newTin.ComputeBB());
// Now return without waiting for ComputeBB to finish
return newTin;
}
Now, you can look up the status in other methods:
if (ptsTin.BoundingBox.Status == TaskStatus.Completed)
{
// Finished computing
}
这篇关于如何让我在后台运行的非必要的计算?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!