需要帮助解决导致“线程泄漏”的奇怪的Begin / EndInvoke问题

时间:2010-07-22 21:54:46

标签: c# .net multithreading

我得到以下代码以~1000ms的速率执行。单独留下,会导致奇怪的“线程泄漏”。使用 WindDBG / SoS 我能够看到许多ThreadPool工作线程(其中一些被标记为死),最终我将获得 AccessVioalation Exception 。任何人都可以告诉我,如果我的 BeginInvoke / 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;
    }

1 个答案:

答案 0 :(得分:1)

看起来你的代码正在使用WPF,而且我的理解是在WPF中,BeginInvoke将对你进行调用;重新编写UI(Dispatcher)线程;所以就我所知,它不应该创建任何额外的线程。

http://msdn.microsoft.com/en-us/library/ms591206.aspx

我注意到您在BeginInvoke调用周围的try / catch对;这告诉我你已经得到了异常,并且我建议找到它们的根源可能比压制它们更好。例如,您似乎引用了三个变量 - BufferSize,rawData,txtIncomingData,它们是在锁定之外定义的 - 如果任何其他代码具有对它们的引用并且正在另一个(非UI)线程上修改它们那么可能导致它们你的问题。

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