ManualResetEvent无法正常工作;线

时间:2013-08-16 15:49:17

标签: c# multithreading wcf manualresetevent

我有一个创建线程的客户端。

那个帖子有一个WaitOne()所以当它被卡在那里我的客户端不会死。 但是当我想关闭我的客户端时,我需要对该手动重置事件进行Set()

我在主类中声明手动重置事件:

public ManualResetEvent mreIn = new ManualResetEvent(false);

这是我的Connect函数,它使用start函数创建线程:

    public void Connect()
    {
        objClientThread = new Thread(start) { IsBackground = true };
        objClientThread.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
                mreIn.WaitOne();
                if (OnShutdownInitiated != null)
                {
                    OnShutdownInitiated(this, new EventArgs());
                }
                System.Threading.Thread.Sleep(500);
                objProxy.Close();
                objConfiguration = null;
                IsConnected = false;
                mreOut.Set();
            }
        }

我有一个回调符合Set()

    Boolean IServiceCallbackContract.Shutdown()
    {
        mreIn.Set();
        return true;
    }

所以它的工作方式是...... 所有模块都在WaitOne()上初始化和阻止 当我关闭模块时,回调会执行Set(),但WaitOne()未解锁且线程不会继续。 我错过了什么?

3 个答案:

答案 0 :(得分:2)

问题在于,当我创建服务客户端时,我不得不传递回调的instace上下文,而我正在执行new所以我没有放置current实例上下文和回调正在对其他实例进行,因此我正在进行的值或事件的每次更改都没有反映在当前的intance中。 感谢@HenkHolterman的帮助:)

答案 1 :(得分:0)

看起来你正在以正确的方式使用ManualResetEvent。但是,你的主题是背景。如果所有其他非后台线程退出,则您的线程将在随机位置中止,mreIn.WaitOne()之后的代码可能无法执行。

如果是这种情况,那么让你的therad非背景会解决这个问题。

答案 2 :(得分:0)

请注意以下示例:

response.getOutputStream().println(mapper.writeValueAsString(data));