在.NET的Azure worker角色中使用Thread.Sleep或Timer?

在.NET的Azure worker角色中使用Thread.Sleep或Timer?,.net,multithreading,timer,azure,azure-worker-roles,.net,Multithreading,Timer,Azure,Azure Worker Roles,我知道在Windows服务中,最好使用定时器而不是线程睡眠(超时)。然而,在我在互联网上找到的所有处理Azure workers的代码示例中,使用的是Thread.Sleep(timeout),而不是Timer 甚至Visual Studio中Worker项目模板中提供的默认代码也使用线程。Sleep: public class WorkerRole : RoleEntryPoint { public override void Run() { // This i

我知道在Windows服务中,最好使用
定时器
而不是
线程睡眠(超时)
。然而,在我在互联网上找到的所有处理Azure workers的代码示例中,使用的是
Thread.Sleep(timeout)
,而不是
Timer

甚至Visual Studio中Worker项目模板中提供的默认代码也使用
线程。Sleep

public class WorkerRole : RoleEntryPoint
{
    public override void Run()
    {
        // This is a sample worker implementation. Replace with your logic.
        Trace.WriteLine("$projectname$ entry point called", "Information");

        while (true)
        {
            Thread.Sleep(10000);
            Trace.WriteLine("Working", "Information");
        }
    }
// ...
}
到目前为止,我还在我的员工中使用
Thread.Sleep
,但我并不真正理解为什么。所以我的问题是,为什么在Azure worker角色中使用
Thread.Sleep(timeout)
,而不是
Timer
?Windows服务和Azure worker之间的区别是什么,导致了我们应该如何构思这种应用程序的差异?在Azure workers中使用
计时器是好是坏


欢迎使用链接到一些资源的任何解释来解释此方法的基本原理,因为到目前为止我找不到任何内容。

Thread.Sleep()
循环的目的是防止
Run()
方法退出。如果退出
Run()
,则工作进程将重新启动。我不知道你能用定时器有效地完成这个目标

最有可能的情况是,您的CPU每1000毫秒唤醒一次线程,而为了什么都不做,而浪费了一点时间。我怀疑这是否重要,但它也让我感到困扰。我的解决办法是等待取消代币

public class WorkerRole : RoleEntryPoint {
    CancellationTokenSource cancelSource = new CancellationTokenSource();

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

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

这可以防止Run()方法退出,而不会将CPU时间浪费在繁忙的等待上。您还可以在程序的其他地方使用CancellationToken来启动可能需要执行的任何其他关机操作

您的意思是,即使我有一个计时器,它被设置为我的
WorkerRole
类的静态字段,并且它的
appeased
事件有一个分配给它的方法,线程在
Run()
方法被处理后仍然会退出?是的,文档中是这么说的。如果您尝试,您很可能会看到您的角色不断地启动、关闭和重新启动。
Thread.Sleep(Timeout.Infinity)
解决方案与等待
WaitHandle
的解决方案相比有什么不同?因此,为什么不直接使用
ManualResetEvent
?很可能是同一件事。啊,你说得对,我们应该把它清理干净。虽然在这种情况下可能不会有任何实际的区别,因为进程无论如何都会关闭。这不是一个真正针对Windows Azure的问题。关于不同的计时器,有一个非常详细的例子。这也适用于Windows Azure虚拟机,因为它们是Windows Server 2008虚拟机。感谢链接。这很有趣,但我觉得它并没有真正回答我的问题。我知道WindowsAzure也是虚拟机,但如果它只是虚拟机,为什么不使用Windows服务呢?这样的话,我的问题就不需要了。啊。。。嗯,你当然可以使用Windows服务。但是,要在WindowsAzure中使用Windows服务,您需要做一些工作。这是一个演示所涉及的内容。在Windows Azure Worker或Web角色提供的事件中运行代码要简单得多。请参阅我的on-ServerFault。是的,我知道这是可能的,但我不想使用Windows服务:)我的评论只是指出,Windows Azure和Windows服务不是一回事,因此它们可能需要进行不同的转换,即使最终它下的确实是Win2k8。