Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程。睡眠时间少于1毫秒_C#_.net_Multithreading - Fatal编程技术网

C# 线程。睡眠时间少于1毫秒

C# 线程。睡眠时间少于1毫秒,c#,.net,multithreading,C#,.net,Multithreading,我想用小于1毫秒的时间调用线程睡眠。 我读到,无论是线程。Sleep还是Windows操作系统都不支持这一点 解决这个问题的办法是什么 对于那些想知道我为什么需要这个的人: 我正在做一个压力测试,想知道我的模块每秒能处理多少条消息。 所以我的代码是: // Set the relative part of Second hat will be allocated for each message //For example: 5 messages - every message will

我想用小于1毫秒的时间调用线程睡眠。 我读到,无论是
线程。Sleep
还是Windows操作系统都不支持这一点

解决这个问题的办法是什么

对于那些想知道我为什么需要这个的人: 我正在做一个压力测试,想知道我的模块每秒能处理多少条消息。 所以我的代码是:

 // Set the relative part of Second hat will be allocated for each message 
 //For example: 5 messages - every message will get 200 miliseconds 
 var quantum = 1000 / numOfMessages;

 for (var i = 0; i < numOfMessages; i++)
 {
      _bus.Publish(new MyMessage());
      if (rate != 0) 
          Thread.Sleep(quantum);
 }
//设置将为每条消息分配的第二顶帽子的相对部分
//例如:5条消息-每条消息将获得200毫秒
var quantum=1000/条消息;
对于(var i=0;i

我很乐意听取你的意见。

你不能这样做。单个睡眠调用的阻塞时间通常会超过一毫秒(这取决于操作系统和系统,但根据我的经验,
Thread.sleep(1)
通常会阻塞12-15毫秒)

一般来说,Windows并不是设计为一个独立的窗口。这种类型的控件通常无法在Windows的正常(桌面/服务器)版本上实现


通常,最接近的方法是旋转并消耗CPU周期,直到达到所需的等待时间(使用高性能计数器测量)。然而,这是相当可怕的-你会吃掉整个CPU,即使这样,你也可能会在操作系统中有时有效地“睡眠”超过1ms…

在过去的好日子里,当需要亚毫秒的分辨率时,你会使用Win32的“QueryPerformanceTimer”API

代码项目中似乎有更多关于该主题的信息:

这将不允许您以Reed Copsey指出的相同分辨率“Sleep()”

编辑:
正如Reed Copsey和Brian Gideon所指出的那样,在.NET中,QueryPerFunanceTimer已经被秒表所取代,大多数使用线程的正当理由都是使用线程。睡眠(1)
或线程。睡眠(0)涉及相当先进的线程同步技术。例如,使用传统技术无法获得所需的分辨率。我不确定你想完成什么,但我想我可以假设你想让一个动作以1毫秒的间隔发生。如果是这样的话,请看一看。它们可以提供低至1ms的分辨率。不幸的是,.NET Framework(我知道)中没有内置的API可以利用此Windows功能。但是您可以使用互操作层直接调用Win32 API。甚至在C#中也有这样做的例子。

为什么?
通常,一台机器上的CPU和内核数量非常有限——如果是独立的执行单元,则得到的CPU和内核数量很少

另一方面,有许多进程和更多线程。每个线程都需要一些处理器时间,这是由Windows核心进程在内部分配的。通常Windows会阻塞所有线程,并为特定线程提供一定的CPU核心时间,然后将上下文切换到其他线程

当您调用Thread.Sleep时,不管您占用线程的整个时间跨度有多小,因为没有理由简单地等待它,而且上下文会立即切换。当Windows下次给线程一些CPU时,可能需要几毫秒的时间

使用什么?
或者,你可以,旋转不是一件可怕的事情,可以非常有用。例如,它在System.Collections.Concurrent命名空间中大量用于非阻塞集合,例如:

SpinWait sw = new SpinWait();
sw.SpinOnce();

下面的代码肯定会提供更精确的阻塞方式,而不是调用
Thread.Sleep(x)(尽管此方法将阻止线程,但不会将其置于睡眠状态)。下面我们使用
StopWatch
类来测量循环和阻塞调用线程所需的时间

using System.Diagnostics;

private static void NOP(double durationSeconds)
{
    var durationTicks = Math.Round(durationSeconds * Stopwatch.Frequency);
    var sw = Stopwatch.StartNew();

    while (sw.ElapsedTicks < durationTicks)
    {

    }
}

关于Reed Copsey接受的答案,这个怎么样

public void Sleep(double msec)
{
   for (var since = DateTime.Now; (DateTime.Now - since).TotalMilliseconds < msec;)
      Thread.Sleep(TimeSpan.FromTicks(10));
}
公共无效睡眠(双毫秒)
{
for(var-since=DateTime.Now;(DateTime.Now-since).totalmillizes
为什么要这样做?解决方法可能是以更合适的方式处理您的问题。;-)如果操作系统不支持,则不支持。你为什么要这样做?如果我可以问的话,这样做的目的是什么?你不能这样做;睡眠几乎总是产生线程的执行,你无法控制或预测操作系统何时决定再次调度它。在非实时操作系统上,精确的睡眠时间是不可能的。这并没有阻碍——它只是给了你一种测量的方法。
Stopwatch
类在C#中有效地实现了这一点(通过内部使用
QueryPerformanceCounter
)。没有,但它提供了更高分辨率的时间参考。我不知道埃雷斯在干什么,但我认为他可以用不同的方法来解决他的问题,使用性能计时器(编辑:秒表,我不知道,谢谢…+1:是的,这是一种合理的方法。除了我要提到的
Stopwatch
而不是
QueryPerformanceCounter
。谢谢Brian,是的,我完全同意应该使用秒表。我会在我的回答中提到这一点。问题是明确地问如何睡眠少于1毫秒。这个答案将阻止而不是睡眠。因为这个问题是关于压力测试的,在这种情况下它可能已经足够好了,所以我还是投票支持它。忘了在我的帖子中提到这一点,现在刚刚更新了它;少了一行代码:)很好,我没有意识到。@Saryk根据帖子,滴答声的持续时间取决于操作系统/硬件。但是,您可以使用
秒表
的属性来确定机器上滴答声的确切长度
public void Sleep(double msec)
{
   for (var since = DateTime.Now; (DateTime.Now - since).TotalMilliseconds < msec;)
      Thread.Sleep(TimeSpan.FromTicks(10));
}