如何恢复或中断睡眠线程

时间:2016-09-07 05:40:46

标签: c# multithreading winforms

当我启动我的应用程序时,我需要检查我的某个服务是否正在运行。如果服务没有运行,那么我必须允许用户启动服务然后继续执行。如果用户选择不启动服务,那么我必须退出应用程序。每10秒我必须弹出消息来启动服务,在此期间程序执行不应该继续。下面是我编写的代码。我正在运行的服务有一个事件处理程序,它通知服务何时可用(事件处理程序是WindowsServiceAvailableEventHandler)。

我这里有两个问题

  1. 如果引发ServiceAvailable事件,如何恢复或中断正在休眠的线程(Thread.Sleep(10000);)?
  2. 当用户想要启动服务时,他会点击Yes按钮和Dailog Box Closes,用户将不知道是否发生了什么事情。所以我正在寻找像进度条这样会告诉用户它正在等待的东西用户启动服务...一旦服务启动,进度条应该关闭。如何实现?
  3. 我的代码:

    this.windowsService.ServiceAvailable += this.WindowsServiceAvailableEventHandler
    
    While (!CheckifServiceStarted()) 
    {
        DialogResult dlgResult = MessageBox.Show("Service is not Started.Please  start Service to continue", "Start Service", MessageBoxButtons.YesNo);
    
        if (dlgResult == DialogResult.Yes) 
        {
            Thread.Sleep(10000);
        }
        else 
        {
            System.Environment.Exit(0);
        }
    }
    
    private void DataServicesAvailableEventHandler(object sender, EventArgs e)
    {
        //How to Resume or Interrupt the Thread here?
    }
    

1 个答案:

答案 0 :(得分:1)

您可以将Thread.Sleep替换为ManualResetEvent.WaitOne来表示处理程序中的更改,如下所示:

private ManualResetEvent serviceAvailableEvent = new ManualResetEvent(false);

this.windowsService.ServiceAvailable += this.WindowsServiceAvailableEventHandler

While (!CheckifServiceStarted()) 
{
    DialogResult dlgResult = MessageBox.Show("Service is not Started.Please  start Service to continue", "Start Service", MessageBoxButtons.YesNo);
    if (dlgResult == DialogResult.Yes) 
        serviceAvailableEvent.WaitOne(10000);
    else 
        System.Environment.Exit(0);
}

private void DataServicesAvailableEventHandler(object sender, EventArgs e)
{
    serviceAvailableEvent.Set();
}

至于进度条,例如,请检查this question