我有一个WinForm应用程序,它使用BackGroundWorker来创建TCP客户端并将一些数据发送到远程服务器。当套接字完成后,关闭连接,BGW退出DoWork子程序。
在RunWorkerCompleted Sub中,我必须等待来自远程服务器的数据包,因此我始终运行一个填充朋友字符串类型变量并指示使用布尔类型变量(标志)接收整个数据包的TCP服务器。
因此,我必须等待标记变为True,以处理字符串类型变量中必须包含的数据;但我不想挂起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 is?
发布于 2015-04-24 15:52:43
根据文件:
SpinWait方法对于实现锁非常有用。.NET框架中的类,例如监视器和ReaderWriterLock,在内部使用此方法。SpinWait本质上将处理器置于一个非常紧的循环中,循环计数由迭代参数指定。因此,等待的时间取决于处理器的速度。 将此与睡眠方法进行对比。--一个调用睡眠的线程生成其当前处理器时间的其余部分,即使指定的时间间隔为零。指定睡眠的非零间隔将删除线程调度程序考虑的线程,直到时间间隔过去为止。
因此,Sleep基本上释放处理器,以便它可以被其他东西使用,而SpinWait运行一个循环,使处理器忙碌(并锁定到其他线程)。
https://stackoverflow.com/questions/29851910
复制相似问题