我有简单的应用程序,隐藏的表单并且不显示在任务栏上(表单的设置),有一个目的 - 显示托盘图标,当服务正在运行时。
我也实现了服务,并使用双工回调向此应用程序发送消息。当它即将停止时,它会向应用程序发送消息,因此它会隐藏托盘图标。问题是,当服务再次启动时,我需要显示图标。现在我用WaitForService
执行此操作,没有超时。
if (sc.Status != ServiceControllerStatus.Running)
sc.WaitForStatus(ServiceControllerStatus.Running);
_notifyIcon.Visible = true;
这样可行 - 代码暂停执行,直到服务再次启动。
但是有一个问题 - 如果应用程序等待一段时间,它被标记为"没有响应",它出现在任务栏中,并出现某种小窗口。那么,有没有其他方法可以避免这种情况? WaitForStatus
的一些解决方法,或监视服务状态的不同方法。
答案 0 :(得分:1)
似乎ServiceController.WaitForStatus
阻止了UI线程。
为避免这种情况,您有multiple choices。我会尝试这个
Thread t = new Thread(() =>
{
sc.WaitForStatus(ServiceControllerStatus.Running);
// Add something to do after the status updates
});
t.Start();
但请记住,您必须使用Form.Invoke与另一个线程中的应用程序UI进行交互。
this.Invoke(new Action(() =>
{
_notifyIcon.Visible = true;
}));