Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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
Multithreading 什么';Thread.Sleep()和Thread.SpinWait()之间的区别是什么_Multithreading_Sockets_Tcp - Fatal编程技术网

Multithreading 什么';Thread.Sleep()和Thread.SpinWait()之间的区别是什么

Multithreading 什么';Thread.Sleep()和Thread.SpinWait()之间的区别是什么,multithreading,sockets,tcp,Multithreading,Sockets,Tcp,我有一个WinForm应用程序,它使用BackGroundWorker创建TCP客户机并将一些数据发送到远程服务器。 插座完成后,关闭连接,BGW退出定位销接头 在RunWorkerCompleted子文件中,我必须等待来自远程服务器的数据包,因此我始终运行一个TCP服务器,该服务器填充一个友元字符串类型变量,并指示使用布尔类型变量(标志)接收整个数据包 因此,我必须等待该标志变为真,以处理必须在字符串类型变量中的数据;但我不想挂断GUI,因此我看到存在一个名为SpinWait的方法 那么,这个

我有一个WinForm应用程序,它使用BackGroundWorker创建TCP客户机并将一些数据发送到远程服务器。 插座完成后,关闭连接,BGW退出定位销接头

在RunWorkerCompleted子文件中,我必须等待来自远程服务器的数据包,因此我始终运行一个TCP服务器,该服务器填充一个友元字符串类型变量,并指示使用布尔类型变量(标志)接收整个数据包

因此,我必须等待该标志变为真,以处理必须在字符串类型变量中的数据;但我不想挂断GUI,因此我看到存在一个名为SpinWait的方法

那么,这个代码可以工作吗

如果5分钟后标志不为真,有没有办法退出循环

Private Sub BGW1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BGW1.RunWorkerCompleted
        While Not AckReady
            System.Threading.Thread.SpinWait(500)
        End While

        'Here process the received data from TCP server

        TmrReport.Start()

End Sub 
另一件事是,有多少次迭代代表500毫秒?

根据文档:

SpinWait方法对于实现锁很有用。NET Framework中的类(如Monitor和ReaderWriterLock)在内部使用此方法SpinWait本质上是将处理器置于一个非常紧密的循环中,循环计数由iterations参数指定。因此,等待的持续时间取决于处理器的速度

将此与睡眠方法进行对比调用Sleep的线程将产生其当前处理器时间片的剩余部分,即使指定的间隔为零。为睡眠指定非零间隔将使线程调度程序不再考虑该线程,直到时间间隔结束


因此,
Sleep
基本上释放了处理器,这样它就可以被其他东西使用,而
SpinWait
运行一个循环,使处理器保持忙碌(并锁定到其他线程)。

如果不工作,当服务器没有响应时,它会冻结您的UI。如果您已经在使用worker,那么您最好让它等待响应。好的,我将while循环移动到DoWork子循环,并使用Sleep而不是SpinWait。我说得对吗?我很不明白你为什么要睡觉。当您得到响应时,您就完成了。@HansPassant远程服务器的响应需要一段时间,可能会在5秒之间变化。到50秒。因此,我必须等待回答来处理数据并将新数据发送到远程服务器。这就是BackgroundWorker的优点,在得到响应之前,不要让DoWork事件处理程序退出。Fwiw、BeginRead和async/wait也完成了这项工作。好吧,那么在SpinWait循环期间,整个服务器都会挂断?
SpinWait()
只是让调用线程在等待时保持忙碌。线程仍要执行任务调度
Sleep()
将调用线程置于睡眠状态,并将其从任务调度中移除,直到唤醒。