我有一个WinForm应用程序,它使用BackGroundWorker创建TCP客户端并将一些数据发送到远程服务器。 当套接字完成后关闭连接,BGW退出DoWork Sub。
在RunWorkerCompleted Sub中我必须等待来自远程服务器的数据包,所以我总是运行一个填充Friend String类型变量的TCP服务器,并指示使用布尔类型变量(flag)接收整个数据包。
所以我必须等待该标志变为True才能处理必须在String类型变量中的数据;但我不想挂断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
另一件事是,有多少次迭代代表500mS?
答案 0 :(得分:1)
根据文件:
SpinWait方法对于实现锁定非常有用。 .NET Framework中的类(如Monitor和ReaderWriterLock)在内部使用此方法。 SpinWait实际上将处理器置于一个非常紧密的循环中,循环计数由迭代参数指定。因此,等待的持续时间取决于处理器的速度。
将此与Sleep方法进行对比。 调用Sleep的线程会产生剩余的当前处理器时间片,即使指定的间隔为零。为Sleep指定非零间隔会从线程调度程序中删除线程,直到时间间隔结束。
因此,Sleep
基本上释放了处理器,因此它可以被其他东西使用,而SpinWait
运行一个循环来保持处理器忙(并锁定到其他线程)。