【问题标题】:How to continue execution of code only when windows service is completed?如何仅在 Windows 服务完成后继续执行代码?
【发布时间】:2011-04-28 20:57:15
【问题描述】:

我有一个执行相当长的运行任务的 Windows 服务。目前,我生成了一个新线程,该线程执行一个方法,该方法关闭并调用此 Windows 服务。此代码如下所示:

Thread thread = new Thread(new ThreadStart(ExecyuteLongRunningMethod));
thread.Start();
thread.Join();

在调用堆栈的较高位置(当此代码完成时),会弹出一个消息框,说明操作的结果。

但是,当这段代码执行时(ExecuteLongRunningMethod 调用 windows svc),会弹出一个消息框,说明该操作没有发生任何变化,但因为这是在上面的代码块完成之前,所以出现错误消息框。

因此,问题是,只有在 Windows 服务完成时才继续在 winforms 应用程序中执行(这就是所谓的 windows svc)的正确方法是什么?我认为上面的方法是不正确的,因为线程将调用 Windows 服务(另一个进程),所以当 Windows 服务完成它的工作时,我的代码(winforms 应用程序)将继续。要么需要某种信号,要么需要命名管道之类的东西?

该应用在 .NET 3.5 中。

谢谢

【问题讨论】:

    标签: c# multithreading windows-services named-pipes


    【解决方案1】:

    通过 WCF API 公开服务执行的状态并使用 netTcp 或命名管道调用它,您可以轮询服务或使用 WCF CallBack。

    【讨论】:

      【解决方案2】:

      为什么不使用 BackgroundWorker,以便为它的完成设置一个事件?
      在 Backgroundworker 运行方法中,您可以运行服务并等待手动重置事件(例如)或互斥锁,当收到此事件时,您可以退出 main 方法。
      因此在您的主线程(例如 UI)中引发 OnCompleted 事件并且工作完成......

      在您的应用中添加一个 Backgroundworker 并将其命名为 bgw
      然后你可以这样做:

      private void bgw_DoWork(object sender, DoWorkEventArgs e)
      {
          // 1. Run the service
          // 2. Wait for mutex
      }
      
      private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
      {
          // Here you can handle the end of the service
          // and return the status in main thread
      }
      

      【讨论】:

      • 谢谢,我去看看。这将如何运作?我的意思是,windows 服务需要发出某种信号,以便 winforms 应用程序知道它已完成。
      • 这样我就不需要修改windows svc了?我试试看。
      • @dotnetdev:您必须以这种方式修改 svc:当您运行它时,它必须创建(或取得)互斥锁 mut 并在完成工作时释放它。 Mutex mut 是您在后台工作人员中等待的那个...
      • 您在不需要时在服务和客户端之间创建紧密耦合。
      • @Llloyd:恕我直言,服务没有与任何东西耦合:它运行创建和释放互斥锁,停止。客户端与服务耦合,但这是一种选择。我错了吗? :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多