gpt4 book ai didi

c# - 如何使用计时器替换Azure辅助角色中的Thread.Sleep(...)?

转载 作者:行者123 更新时间:2023-12-02 11:17:59 25 4
gpt4 key购买 nike

有很多人说在 Azure Worker Role 中使用 Timer 而不是 Thread.Sleep(...) 。没有问题。

我很难理解的是如何编码。

目前,我有以下(伪代码)

_timer.Elapsed += (sender, args) => DoWork();

public override void Run()
{
while(true)
{
DoWork();
}
}

public void DoWork()
{
try
{
_timer.Stop();

// Now - do stuff ....

}
catch(....) { ... }

_timer.Start()
}

发生的情况是,代码进入 DoWork() 方法一次,然后 DoesStuff(tm).. 很好 .. 启动计时器(比如 .. 30 秒间隔),然后退出该方法。

然后,它返回到该循环中的主 Run() 方法。因此它立即返回并再次进入DoWork()方法..而不是等待计时器将其关闭。

所以我不确定如何用计时器替换任何Thread.Sleep(...)

有什么线索吗?

澄清

我不想退出 Run() 方法:) 我很高兴能够永远循环下去。我所坚持的是替换标准的 Thread.Sleep(...) 调用(它会阻塞线程)并将其替换为大多数人都使用的 Timer建议。

更新

请不要链接或建议我应该使用 cancelSource.Token.WaitHandle.WaitOne(); 作为解决方案。这不是我在这里想要实现的目标。请注意帖子标题!

最佳答案

我认为,如果您想按照此处概述的方式解决这种情况,您将需要一个 WaitHandle 和一个计时器。

简短的答案如下。长答案变成了一篇博客文章:HowTo wait in a WorkerRole using Timer and EventWaitHandle over Thread.Sleep

我使用了 EventWaitHandle 和 Timer 并提出了这个解决方案:

public class WorkerRole : RoleEntryPoint
{
Waiter waiter;

public override bool OnStart()
{
waiter = new Waiter(WorkerConfiguration.WaitInterval);
return base.OnStart();
}

public override void Run()
{
while (true)
{
DoWork();
waiter.Wait();
}
}

public void DoWork()
{
// [...]
}
}

这是服务员类:

public class Waiter
{
private readonly Timer timer;
private readonly EventWaitHandle waitHandle;

public Waiter(TimeSpan? interval = null)
{
waitHandle = new AutoResetEvent(false);
timer = new Timer();
timer.Elapsed += (sender, args) => waitHandle.Set();
SetInterval(interval);
}

public TimeSpan Interval
{
set { timer.Interval = value.TotalMilliseconds; }
}

public void Wait(TimeSpan? newInterval = null)
{
SetInterval(newInterval);
timer.Start();
waitHandle.WaitOne();
timer.Close();
waitHandle.Reset();
}

private void SetInterval(TimeSpan? newInterval)
{
if (newInterval.HasValue)
{
Interval = newInterval.Value;
}
}
}

关于c# - 如何使用计时器替换Azure辅助角色中的Thread.Sleep(...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14707693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com