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

时间:2011-04-28 20:57:16

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

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

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

在callstack中更高(当完成此代码时),会弹出一个消息框,说明操作的结果。

然而,当这段代码执行时(ExecuteLongRunningMethod调用windows svc),会弹出一个消息框,指出由于操作没有任何改变,但是因为这是在上面的代码块完成之前,出现错误的消息框。

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

该应用程序在.NET 3.5中。

由于

2 个答案:

答案 0 :(得分:0)

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

在您的应用中添加背景工作者,并将其命名为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
}

答案 1 :(得分:0)

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