C# 需要帮助解决导致“异常开始/结束调用”的问题;“螺纹泄漏”;

C# 需要帮助解决导致“异常开始/结束调用”的问题;“螺纹泄漏”;,c#,.net,multithreading,C#,.net,Multithreading,我得到以下代码以~1000ms的速度执行。如果不加以考虑,它会导致一个奇怪的“线程泄漏”。使用WindDBG/SoS我可以看到许多线程池工作线程(其中一些被标记为死线程),最终我将得到一个访问异常。有谁能告诉我,如果我的开始调用/EndInvoke使用错误,可能是不必要的锁。。。任何线索都会对我有所帮助。。。嗯,在这一点上毫无头绪 RichTextBox tmpBox = txtIncomingData; lock (m_TextUpdateSynch) { try { r

我得到以下代码以~1000ms的速度执行。如果不加以考虑,它会导致一个奇怪的“线程泄漏”。使用WindDBG/SoS我可以看到许多线程池工作线程(其中一些被标记为死线程),最终我将得到一个访问异常。有谁能告诉我,如果我的开始调用/EndInvoke使用错误,可能是不必要的锁。。。任何线索都会对我有所帮助。。。嗯,在这一点上毫无头绪

RichTextBox tmpBox = txtIncomingData;

lock (m_TextUpdateSynch) {
   try {
       result = Utilities.SafeBeginInvoke(this, delegate() {
           try {
               if (tmpBox.Text.Length > BufferSize) {
                   tmpBox.Text = rawData;
               }
               else {
                   tmpBox.AppendText(rawData);
               }
               pageBottom(txtIncomingData);
           }
           catch (...) {}
       });
       this.EndInvoke(result);
   }


    public static IAsyncResult Utilities.SafeBeginInvoke(System.ComponentModel.ISynchronizeInvoke control, 
ControlUpdate action, AsyncCallback callback, 
params object[] args) {
        IAsyncResult result = null;

        Control uiControl = control as Control;
        try {
            result = control.BeginInvoke(action, args);
        }
        catch (...) { }

        return result;
    }

看起来您的代码正在使用WPF,据我所知,在WPF中,BeginInvoke将对您的呼叫进行处理;重新生成UI(Dispatcher)线程;所以就我所知,它不应该创建任何额外的线程

我也注意到你在BeginInvoke通话中的try/catch配对;这对我来说意味着,你已经得到了由此引发的异常,我建议找到它们的根源可能是一个比抑制它们更好的计划。例如,您似乎引用了三个变量—BufferSize、rawData、txtIncomingData,它们是在您的锁之外定义的—如果任何其他代码都引用了它们,并且正在另一个(非UI)线程上修改它们,那么这可能会导致您的问题


最后,我认为您列出的SafeBeginInvoke重载不是代码调用的重载-列出的重载需要4个参数(尽管其中一个是params),您调用的重载需要2个参数。

看起来您的代码使用的是WPF,我的理解是,在WPF中,BeginInvoke将对您的调用进行马歇尔处理;重新生成UI(Dispatcher)线程;所以就我所知,它不应该创建任何额外的线程

我也注意到你在BeginInvoke通话中的try/catch配对;这对我来说意味着,你已经得到了由此引发的异常,我建议找到它们的根源可能是一个比抑制它们更好的计划。例如,您似乎引用了三个变量—BufferSize、rawData、txtIncomingData,它们是在您的锁之外定义的—如果任何其他代码都引用了它们,并且正在另一个(非UI)线程上修改它们,那么这可能会导致您的问题


最后,我认为您列出的SafeBeginInvoke重载不是代码调用的重载-列出的重载包含4个参数(尽管其中一个是params),您调用的重载包含2个参数。

关于重载方法,有一个重载方法接受2个参数,并在不需要时为回调和参数传递null。这里没有WPF,只有Winforms-我的钱是在使用EndInvoke时出错-但我将更仔细地研究在不同线程上使用的变量。关于重载方法,有一个方法接受2个参数,如果不需要,则为回调和参数传递null。这里没有WPF,只有Winforms—我的钱是关于EndInvoke的使用是否被错误使用—但我将更仔细地研究在不同线程上使用的变量。