如何让我在后台运行的非必要的计算

如何让我在后台运行的非必要的计算

本文介绍了如何让我在后台运行的非必要的计算?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个问题将在后续。我意识到,我的真正的问题是一个比在该职位上一个台阶。下面的问题我现在问,是我怎么做到这一点?



我想用并发在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
}

这篇关于如何让我在后台运行的非必要的计算?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-03 23:58