如何仅在 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 服务完成后继续执行代码?的主要内容,如果未能解决你的问题,请参考以下文章