Multithreading 什么';Thread.Sleep()和Thread.SpinWait()之间的区别是什么
我有一个WinForm应用程序,它使用BackGroundWorker创建TCP客户机并将一些数据发送到远程服务器。 插座完成后,关闭连接,BGW退出定位销接头 在RunWorkerCompleted子文件中,我必须等待来自远程服务器的数据包,因此我始终运行一个TCP服务器,该服务器填充一个友元字符串类型变量,并指示使用布尔类型变量(标志)接收整个数据包 因此,我必须等待该标志变为真,以处理必须在字符串类型变量中的数据;但我不想挂断GUI,因此我看到存在一个名为SpinWait的方法 那么,这个代码可以工作吗 如果5分钟后标志不为真,有没有办法退出循环Multithreading 什么';Thread.Sleep()和Thread.SpinWait()之间的区别是什么,multithreading,sockets,tcp,Multithreading,Sockets,Tcp,我有一个WinForm应用程序,它使用BackGroundWorker创建TCP客户机并将一些数据发送到远程服务器。 插座完成后,关闭连接,BGW退出定位销接头 在RunWorkerCompleted子文件中,我必须等待来自远程服务器的数据包,因此我始终运行一个TCP服务器,该服务器填充一个友元字符串类型变量,并指示使用布尔类型变量(标志)接收整个数据包 因此,我必须等待该标志变为真,以处理必须在字符串类型变量中的数据;但我不想挂断GUI,因此我看到存在一个名为SpinWait的方法 那么,这个
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()
将调用线程置于睡眠状态,并将其从任务调度中移除,直到唤醒。