ste*_*ris 5 c# multithreading asynchronous task waithandle
我正在尝试创建一个 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();
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码似乎应该根据我的研究工作,但我不明白这!cancel.WaitHandle.WaitOne(interval)部分。每五分钟等待一次,如何保持循环继续进行?我需要理解这部分代码才能完成我的脚本,或者知道我对 WaitHandle 的使用是否完全错误。
这就是我想到的地方:创建 ac# windows 服务来轮询数据库
正如 Hans 指出的文章所解释的,这里的用法是有一种方法让线程等待某个特定的时间段,但仍然允许线程在超时期限到期之前被唤醒,例如,如果您需要线程提前终止(如此处)。
也就是说,这种实现是“老派”。async:) 如果您使用 .NET 4.5,恕我直言,如果您使用/习惯用法,代码会工作得更好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
}
}
Run Code Online (Sandbox Code Playgroud)
有了上面的代码,代码就更正确地表达了意图。也就是说,虽然该WaitHandle版本似乎主要是在等待退出信号,即使工作的主要机制实际上是等待超时,但这里的代码清楚地表明主要意图是延迟,并且有可能延迟被取消。
| 归档时间: |
|
| 查看次数: |
6120 次 |
| 最近记录: |