在.NET的Azure worker角色中使用Thread.Sleep或Timer?
我知道在Windows服务中,最好使用在.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
定时器
而不是线程睡眠(超时)
。然而,在我在互联网上找到的所有处理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。