C# 如何强制线程中的一段代码不间断地运行(防止被操作系统抢占)

C# 如何强制线程中的一段代码不间断地运行(防止被操作系统抢占),c#,multithreading,task-parallel-library,C#,Multithreading,Task Parallel Library,对于给定的任务T和代码块(这里用方法包装)m1、m2和m3 是否有一种方法来强制其中任何一个——即M2-不间断地运行,即,运行该程序的线程在达到其时间片限制时,如果在M2执行期间,不离开处理器,直到M2完成,然后为新线程腾出空间?< /P> 这可能吗 例如: class Program { static void Main(string[] args) { Task task = new Task(() =>

对于给定的任务T和代码块(这里用方法包装)m1、m2和m3

是否有一种方法来强制其中任何一个——即M2-不间断地运行,即,运行该程序的线程在达到其时间片限制时,如果在M2执行期间,不离开处理器,直到M2完成,然后为新线程腾出空间?< /P> 这可能吗

例如:

class Program
    {
        static void Main(string[] args)
        {
            Task task = new Task(() =>
            {
                m1();

                //I want to assure m2 runs uninterruptedly, i.e., that the running thread does not stop while executing m2
                m2();

                m3();
            });
        }

        private static void m1()
        {
            //whatever1...
        }

        private static void m2()
        {
            //whatever2...
        }

        private static void m3()
        {
            //whatever3...
        }
    }
当回答每个人的“你们为什么想到这个?”时,它突然出现在试图找到问题解决方案的时候。我的想法:我需要保证我从主窗口手柄到主窗口手柄的切换不会被中断/抢占


对于我真正的问题,这是否是一个合理的解决方案-我认为这个问题值得一问。

不。您正在操作系统上运行代码,因此您没有任何能力阻止抢占

你真正的问题是什么?试着描述一下你的实际问题,为什么你会提出这个要求,然后也许有人可以为你的实际问题提供建议

更新后

记住这条多线程编程的简单经验法则:线程几乎永远不是正确答案,事件驱动编程几乎总是正确答案。除非您有CPU密集型计算能力,无法在不同的数据集上扩展,否则很少需要添加线程。仅仅为了等待IO(导航到URL…)而生成新线程(或任务)是一种反模式。不幸的是,99.999%的多线程编程示例只是使用线程来简化控制流


考虑到这一点,例如考虑使用事件驱动模型。您将只有一个线程,即主线程,并在其中对web驱动程序事件(下载的URL、打开的选项卡等)作出反应。

必须切换到支持实时扩展的嵌入式windows版本。即使这样,您也需要从C语言切换到本地语言才能使用这些调度功能


您最好在执行
m2
的过程中更改,使其不太可能脱离计划。但是,如果要这样做,则不应使用
Task.Run
,而应使用实际的
Thread
对象,不应更改线程池线程的优先级(这就是
Task.Run
使用的).

这是一种情况,正确答案取决于你为什么要做你想做的事情。做好这件事比听起来要困难得多

一般来说,是的。你可以通过多种方式实现这一点。然而,从上下文来看,我假设您想知道是否可以在Windows操作系统上实现这一点。简而言之,答案是否定的。Windows有一个抢占式多任务内核,用户进程无法阻止它在时间片结束时中断线程

然而,这并不是全部。您可以将线程的优先级设置为“REALTIME”,这将防止它被任何其他线程抢占。调度程序仍然会抢占您的位置,但因为没有其他人具有更高的优先级,所以它会立即返回给您。这解释了如何做到这一点

请注意,这被认为是一个坏主意。如果管理不当,它将接管整个机器,并使其突然停止

对于大多数用户,建议使用


如果您的软件确实需要实时服务(也就是说,能够运行一些关于服务质量的硬保证),您可以查看Windows或Linux的实时扩展,或者像或这样的完全实时系统。

您可以更改线程的优先级,但这很少是一件合适的事情。我可能错了,但我非常确定,对C#/.NET来说,微观管理单个线程的CPU资源分配太低级了。我能想到的最接近的是设置Thread.Priority属性,但这不能保证任何事情。线程优先级不只是与进程调度相关吗?也就是说,如果在这个或那个线程之前/之后。。。如果是这样,在这里没有帮助。除了文档中提到的操作系统不必遵循程序定义的优先级之外,这听起来真的像是一个问题,请解释一下你认为拥有一个不间断线程可以解决的问题,我们可能会给你一个可以解决的替代解决方案。正如下面向Ramus提到的,在我等待帮助的时候,我突然想到了这个问题:谢谢雷姆斯。好吧,当我在等待帮助时,这个“要求”突然出现在我试图找出解决方法的时候:-)@Veverke我不知道有一个不能被操作系统打断的线程如何帮助你解决另一个问题。看起来你只需要更好地控制哪些线程同时访问
webDriver
。@ScottChamberlain:我的想法是:我需要保证与窗口句柄之间的切换不会中断。但是如果你的观点是正确的——我不应该在线程内使用webDriver实例(假设它不是线程保存),那么答案确实与此无关。无论如何,我认为这个问题是值得的。谢谢你的见解,斯科特。那么,这就使得当前选择的答案不正确了。谢谢分享。然而,关于实时优先级,当你说它将防止线程被抢占时——这只有在没有其他实时线程存在的情况下才会成立,对吗?如果是这样的话,你是说是的,这是可能的,但除非(在谈论Windows时)你只有一个这样的线程。是的。请注意,这与无中断运行不同,在多核系统中,它将无法实现您在问题中链接到的目标(因为其他线程可能以较低的优先级在其他核上运行,并导致pr)