首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WaitHandle.WaitOne

使用WaitHandle.WaitOne
EN

Stack Overflow用户
提问于 2015-02-04 18:12:02
回答 1查看 5.1K关注 0票数 5

我试图创建一个windows服务,每5分钟轮询一次系统,并检查一些需要完成的操作。我已经阅读了WaitHandles及其在这方面的有用性,但需要了解它是如何工作的。

见下面的代码:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-05 04:56:40

正如文章Hans向您解释的那样,这里的用法是有一种方式让线程等待一定的时间,但仍然允许线程在超时期到期之前被唤醒,例如,如果需要线程提前终止(如这里)。

也就是说,这一实施是“老派”。)如果您使用的是.NET 4.5,则如果您使用async/await成语(特别是因为您已经在使用CancellationTokenSource),则代码会更好地工作:

代码语言:javascript
复制
    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版本似乎主要是等待发出退出信号,尽管主要机制实际上是等待超时,但这里的代码清楚地表明,主要意图是延迟,可能会取消延迟。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28328421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档