gpt4 book ai didi

c# - 自定义 System.Diagnostics.TraceListener 输出到 RichTextBox 挂起

转载 作者:行者123 更新时间:2023-12-03 12:57:57 24 4
gpt4 key购买 nike

我有一个 RichTextBox,我将其用作自定义 TraceListener 的输出,如下所示:
问题是,如果有人从其他人那里写调试/跟踪信息,这似乎很难死锁
线程,而 GUI 对话框也正在尝试写入调试/跟踪信息。

有人愿意在这里指出一些明显的错误吗? :

class MyTraceListener : TraceListener
{
private RichTextBox output;

public MyTraceListener (RichTextBox output) {
this.Name = "DebugTrace";
this.output = output;
}


public override void Write(string message) {
Action append = delegate() { output.AppendText(message); };
if (output.InvokeRequired) {
IAsyncResult result = output.BeginInvoke(append);
output.EndInvoke(result);
} else {
append();
}
}

public override void WriteLine(string message) {
Action append = delegate() { output.AppendText(message + "\r\n"); };
if (output.InvokeRequired) {
IAsyncResult result = output.BeginInvoke(append);
output.EndInvoke(result);
} else {
append();
}

}
}

最佳答案

以下是可能发生的情况:

  • 线程 1:到达 EndInvoke();
    等待执行委托(delegate)
    图形用户界面线程。
  • GUI线程:正在阻塞
    System.Diagnostics.Trace.WriteLine
    某处(afaik 跟踪系统
    使用锁是线程安全的。)
  • 线程 1:将永远阻塞,因为 GUI 线程被阻塞并且无法完成委托(delegate)的执行。

  • 仅调用 Invoke 可能无法解决问题,因为 Invoke 会阻塞直到委托(delegate)完成运行。

    仅调用 BeginInvoke 应该可以解决锁定问题,BeginInvoke 只会启动对 GUI 线程的异步调用,而不是等待它完成,从而离开跟踪系统并解除对 GUI 线程的阻塞。 (我不确定不调用 EndInvoke 的后果。

    关于c# - 自定义 System.Diagnostics.TraceListener 输出到 RichTextBox 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1357557/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com