gpt4 book ai didi

c# - 使用 WaitHandle.WaitOne

转载 作者:行者123 更新时间:2023-11-30 17:45:07 27 4
gpt4 key购买 nike

我正在尝试创建一个 Windows 服务,该服务每 5 分钟轮询一次系统并检查需要完成的某些操作。我已经阅读了 WaitHandles 及其在该领域的实用性,但需要了解其工作原理。

见下面的代码:

public partial class PollingService : ServiceBase
{
private CancellationTokenSource cancelToken = new CancellationTokenSource();
private Task mainTask = null;
public PollingService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
mainTask = new Task(pollInterval, cancelToken.Token, TaskCreationOptions.LongRunning);
mainTask.Start();
}
public void pollInterval()
{
CancellationToken cancel = cancelToken.Token;
TimeSpan interval = TimeSpan.FromMinutes(5);
while (!cancel.IsCancellationRequested && !cancel.WaitHandle.WaitOne(interval))
{
if (cancel.IsCancellationRequested)
{
break;
}
EventLog.WriteEntry("*-HEY MAN I'M POLLNG HERE!!-*");
//Polling code goes here. Checks periodically IsCancellationRequested
}
}
protected override void OnStop()
{
cancelToken.Cancel();
mainTask.Wait();
}
}

根据我的研究,上面的代码似乎应该起作用,但我不理解 !cancel.WaitHandle.WaitOne(interval) 部分。这如何让循环每五分钟等待一次呢?我需要理解这部分代码才能完成我的脚本,或者知道我在使用 WaitHandle 时是否完全错误。

这就是我的想法:Creating a c# windows service to poll a database

最佳答案

正如 Hans 指出的文章所解释的那样,这里的用法是让线程等待某个特定的时间段,但仍然允许线程在超时期限到期之前被唤醒,例如如果您需要线程提前终止(如此处)。

也就是说,这个实现是“老派”的。 :) 如果您使用的是 .NET 4.5,恕我直言,如果您使用 async/await 习惯用法(特别是因为您已经在使用 CancellationTokenSource ):

    protected async override void OnStart(string[] args)
{
try
{
await pollInterval();
}
catch (TaskCanceledException) { }
}

public async Task pollInterval()
{
CancellationToken cancel = cancelToken.Token;
TimeSpan interval = TimeSpan.FromMinutes(5);
while (true)
{
await Task.Delay(interval, cancel);
EventLog.WriteEntry("*-HEY MAN I\"M POLLNG HERE!!-*");
//Polling code goes here. Checks periodically IsCancellationRequested
}
}

有了上面的代码,代码更准确的表达了意图。也就是说,虽然 WaitHandle 版本主要是在等待退出信号,但实际上主要机制是等待超时,这里的代码清楚地表明主要意图是延迟,延迟有可能被取消。

关于c# - 使用 WaitHandle.WaitOne,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28328421/

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