我得到以下代码以~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;
}
答案 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个。