Thread.Sleep()和Thread.SpinWait()

时间:2015-04-24 15:45:21

标签: multithreading sockets tcp

我有一个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?

1 个答案:

答案 0 :(得分:1)

根据文件:

Thread.SpinWait Method

  

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

     

将此与Sleep方法进行对比。 调用Sleep的线程会产生剩余的当前处理器时间片,即使指定的间隔为零。为Sleep指定非零间隔会从线程调度程序中删除线程,直到时间间隔结束。

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

相关问题