我需要知道如何在没有任何其他线程能够拥有CPU时间的情况下依次运行一小段相邻的代码行。
if (status != Status.Pending)
return;
status = Status.Locked;
我正在主线程上开发一个带有用户界面的应用程序,该主线程填充了一大堆辅助线程所消除的未完成的异步任务。在开始意识到tasks是内置的之前,我开始开发自定义对象以表示这些活动。对于这个项目,我想继续使用我的自定义任务对象。
我有线程等待任务显示在列表中,然后第一个锁定它会保留它。用于将其状态设置为Locked的每个任务的第一行行 - 但即使在查找任务和锁定任务之间的微小差距中,多个线程偶尔会执行相同的任务。
我的第一个想法是研究如何处理线程的优先级。 This documentation似乎描述了我所希望的 - 高优先级线程在任何低优先级线程之前占用所有资源。这似乎是一个好主意,如果我的工作代码之前暂时提高当前线程的优先级。
Thread.CurrentThread.Priority = ThreadPriority.Highest;
但是从同一个网站this code example显示,在一段时间内,任务都得到足够的重视,我无法依靠一个高优先级的线程完成其工作。我希望CPU中的多核是罪魁祸首。
// The example displays output like the following:
// ThreadOne with Normal priority has a count = 755,897,581
// ThreadThree with AboveNormal priority has a count = 778,099,094
// ThreadTwo with BelowNormal priority has a count = 7,840,984
哦,here is the nail in the coffin我们光荣的领导人杰夫阿特伍德提出了这个想法。
我的下一个想法是暂时冻结所有其他辅助线程,然后在我的块完成后解冻它们。乌尔克!在多核CPU环境中,我可以想象这个代码可能同时在两个内核上运行;这将是游戏结束。
foreach (Thread thread in ActivityQueue.threads)
if (thread != Thread.CurrentThread)
thread.Suspend();
我还有哪些其他选项可以确保我可以检查某些内容是否已被锁定,然后在代码可以同时运行时将其锁定或退出?欢迎使用内置Task对象的示例。
This question被标记为重复。我说@Daniel Hilgarth的基本答案不,你不能指出我远离那个方向。正如评论中指出的那样,我对一个典型的XY问题感到嘘声 - 但我很容易只能在后视中识别出来。
答案 0 :(得分:2)
“填充未完成的异步任务列表的线程” - 在该句中是您问题的关键。您不需要同步任务的执行。您需要同步从队列中取出。
最简单的方法是首先使用并发的方法,因此任何两个线程永远都不能出列同一个项目(在你的情况下是任务)。
例如,BlockingCollection除了并发之外还提供了许多其他便利。例如:您可以在不使用旋转/等待的情况下等待项目的可用性。您可以轻松地发出“不再需要的物品”的信号,以优雅地终止消费者......
请注意,我假设您没有使用基于任务的异步模式。如果这样做,还有内置的机制来实现您期望的行为。