首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Thread.Sleep()和Thread.SpinWait()有什么区别?

Thread.Sleep()和Thread.SpinWait()有什么区别?
EN

Stack Overflow用户
提问于 2015-04-24 15:45:21
回答 1查看 1.6K关注 0票数 3

我有一个WinForm应用程序,它使用BackGroundWorker来创建TCP客户端并将一些数据发送到远程服务器。当套接字完成后,关闭连接,BGW退出DoWork子程序。

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

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

那么,这个代码能工作吗?

如果标记在5分钟后不为真,有什么方法可以退出循环吗?

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

发布于 2015-04-24 15:52:43

根据文件:

Thread.SpinWait法

SpinWait方法对于实现锁非常有用。.NET框架中的类,例如监视器和ReaderWriterLock,在内部使用此方法。SpinWait本质上将处理器置于一个非常紧的循环中,循环计数由迭代参数指定。因此,等待的时间取决于处理器的速度。 将此与睡眠方法进行对比。--一个调用睡眠的线程生成其当前处理器时间的其余部分,即使指定的时间间隔为零。指定睡眠的非零间隔将删除线程调度程序考虑的线程,直到时间间隔过去为止。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29851910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档