0

让我描绘一下我的情况:

我有一个创建线程的 WCF 服务器。该线程执行一个程序集,让我们调用它ABC.exe。这ABC.exe是这样做的:

    static void Main(string[] args)
    {
        objClientBase.OnHandshakeCompleted += new EventHandler(objClientBase_OnHandshakeCompleted);
        objClientBase.OnShutdownInitiated += new EventHandler(objClientBase_OnShutdownInitiated);
        objClientBase.Connect();
        objOEEMon = new Main();
        System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
    }

在哪里Connect

        objClientThread = new Thread(start) { IsBackground = true };
        objClientThread.Start();

start

    /// <summary>
    /// Starts the client program.
    /// </summary>
    private void start()
    {
            //We Open the proxy to let connections happen
            objProxy.Open();
            if (performHandshake())
            {
                IsConnected = true;
                DelayedShutdownBool = false;
                //While connected, the thread keeps the client alive
                while (IsConnected)
                {
                    System.Threading.Thread.Sleep(500);
                    if (DelayedShutdownBool)
                    {
                        System.Threading.Thread.Sleep(500);
                        objProxy.Close();
                        objConfiguration = null;
                        IsConnected = false;
                    }
                }
            }
    }

ABC.exe是使用 WCF 连接到服务器的客户端。

因此,与其让Sleep(Infinite)我想使用manualResetEvents (或其他东西),不如让 s得到关于创建和结束执行Main()的线程结束的通知。Connect但我不知道如何Main得到通知,因为正在调用创建线程的实例的函数。

我不想要的是主动等待while(condition) sleep

4

3 回答 3

1

我的错...我传递了我的类的一个新实例而不是当前实例,所以我的回调是对另一个实例完成的,所以修改的变量不是正确的。

现在完美运行。感谢您的回答,他们帮助我思考了思考错误在哪里的顺序。

于 2013-08-16T19:19:20.897 回答
0

一种解决方案是使用Task类而不是显式创建Thread

 //here instead of creating a Thread, create a Task and return it to the caller
 objClientThread = new Thread(start) { IsBackground = true };
 objClientThread.Start();

然后你可以做

 Task task = objClientBase.Connect();
 task.Wait();
于 2013-08-16T12:27:09.107 回答
0

如果您想使用手动重置事件,您可以执行以下操作,声明一个新的重置事件:

private static ManualResetEvent finished = new ManualResetEvent(false);

等待事件:

        //We Open the proxy to let connections happen
        objProxy.Open();
        if (performHandshake())
        {
            IsConnected = true;
            DelayedShutdownBool = false;
            //While connected, the thread keeps the client alive
            finished.WaitOne();
            if (DelayedShutdownBool)
            {
                System.Threading.Thread.Sleep(500);
                objProxy.Close();
                objConfiguration = null;
                IsConnected = false;
            }
        }

然后在 objClientBase_OnShutdownInitiated 中:

finished.Set();
于 2013-08-16T12:42:53.483 回答