【发布时间】:2017-06-24 23:52:04
【问题描述】:
我在 SO 上看到了几篇与我的问题类似的帖子,但没有一个能解决我的问题。我正在创建一个 Windows 服务,它将每隔几秒钟左右轮询一次 Redis 数据库并根据结果执行操作。我想创建一个“线程池”,这样如果我在处理另一个命令(在另一个线程上)时从 Redis 获得结果,我可以同时运行多个操作。
我的一个主要问题是,当我停止我的 Windows 服务时,该进程仍然保持活动状态约 30 秒左右,而不是关闭。以下是相关代码sn-ps:
Thread Worker;
IDatabase db = ...;
AutoResetEvent StopRequest = new AutoResetEvent(false);
protected override void OnStart(string[] args) {
var poller = new Poller();
Worker = new Thread(() => poller.Poll(StopRequest));
Worker.Start();
}
protected override void OnStop() {
// Signal worker to stop and wait until it does
StopRequest.Set();
Worker.Join();
}
这是Poller 类Poll 方法的示例。
public async void Poll(AutoResetEvent finished)
{
var res = string.Empty;
while (!finished.WaitOne(1000))
{
res = db.StringGet($"task");
if (!String.IsNullOrEmpty(res))
{
ParseAction(res);
}
db.KeyDelete($"task");
}
}
因此,这段代码(删减了很多内容)可以在后台正确运行,并且似乎可以很好地处理来自 Redis 的传入查询,但我遇到了进程无法正确关闭的问题,如上所述。我也不确定这是否是应对这种情况的最佳方法。我喜欢一些关于更好或更“惯用”的方法来处理这个线程问题的指示。
谢谢!
【问题讨论】:
标签: c# multithreading windows-services