如何仅在 Windows 服务完成后继续执行代码?

Posted

技术标签:

【中文标题】如何仅在 Windows 服务完成后继续执行代码?【英文标题】:How to continue execution of code only when windows service is completed? 【发布时间】: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 中。

谢谢

【问题讨论】:

【参考方案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:恕我直言,服务没有与任何东西耦合:它运行创建和释放互斥锁,停止。客户端与服务耦合,但这是一种选择。我错了吗? :)

以上是关于如何仅在 Windows 服务完成后继续执行代码?的主要内容,如果未能解决你的问题,请参考以下文章

仅在 javascript 循环完成后执行 ajax 调用

如何仅在交易完成后重定向?

vs2015 windows服务怎么安装

仅在函数执行完成后打印 [重复]

仅在第一个功能完成后才执行功能 - ios

Android - 仅在 AsyncTask 未完成时单击按钮时显示进度对话框