c# - "while(true) { Thread.Sleep }"的原因是什么?

标签 c# multithreading azure-worker-roles

有时会遇到如下形式的代码:

while (true) {
  //do something
  Thread.Sleep(1000);
}

我想知道这是好的还是坏的做法,是否还有其他选择。

通常我在服务的主要功能中“找到”这样的代码。

我最近在 windows azure worker 角色的“运行”函数中看到了如下形式的代码:

ClassXYZ xyz = new ClassXYZ(); //ClassXYZ creates separate Threads which execute code
while (true) {
  Thread.Sleep(1000);
}

我假设有更好的方法来防止服务(或 azure worker 角色)退出。 有人对我有什么建议吗?

最佳答案

好吧,当您使用 Thread.Sleep(1000) 执行此操作时,您的处理器会浪费一小段时间来唤醒并且什么都不做。

你可以用 CancelationTokenSource 做类似的事情.

当您调用 WaitOne() 时,它将等待直到收到信号。

CancellationTokenSource cancelSource = new CancellationTokenSource();

public override void Run()
{
    //do stuff
    cancelSource.Token.WaitHandle.WaitOne();
}

public override void OnStop()
{
    cancelSource.Cancel();
}

这将防止 Run() 方法退出,而不会在忙等待中浪费您的 CPU 时间。

关于c# - "while(true) { Thread.Sleep }"的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23616506/

相关文章:

c# - 如何从单个解决方案生成多个 .exe 文件?

C#:将成员变量放入列表中

C# 电子邮件地址验证

c# - List<T>.Contains 和 T[].Contains 的行为不同

azure - 使用 Azure 预定电子邮件

azure - Web 服务绑定(bind)到 Windows Azure 中的 Web 角色?

c++ - 对在 std::map 的查找/插入上使用可升级锁感到困惑

java - 捕获声卡数据的 Java 线程的问题

java - Java BlockingQueue 中的 put(s) 和 take(s)

azure - F# Azure 辅助角色和目标运行时