等待创建创建线程的实例的线程

时间:2013-08-16 12:07:21

标签: c# multithreading wcf

让我描绘一下我的情况:

我有一个创建线程的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)我想使用manualResetEvent s(或其他内容),而不是让Main()收到有关Connect所做的线程结束的通知并结束他的执行。但我不知道如何通知Main,因为它正在调用创建线程的实例的函数。

我不想要的是有while(condition) sleep

的积极等待

3 个答案:

答案 0 :(得分:1)

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

现在完美无缺。 感谢您的回答,他们帮我思考了错误发生在哪里的序列。

答案 1 :(得分: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();

答案 2 :(得分: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();