gpt4 book ai didi

c# - 从后台工作人员登录MyLogger时发生跨线程InvalidOperationException

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

我创建了一个事件驱动的记录器,从另一个线程调用时似乎出现了问题。如何使它线程安全?

这是LoggerClass:

public static class MyLogger
{
private static List<string> log = new List<string>();
public static event EventHandler LogAdded;
private static string indent = "";

public static void Log(string message)
{
log.Add(indent + message);
if (LogAdded != null)
LogAdded(null, EventArgs.Empty);
}
}

在表单类中,我通过以下两种方式启动它:
public frm_main()
{
InitializeComponent();
MyLogger.LogAdded += new EventHandler(MyLogger_LogAdded);
}

这是发生崩溃的事件进度:
private void MyLogger_LogAdded(object sender, EventArgs e)
{
int length = rtb_logger.TextLength; // at end of text
string prefix = string.Format("{0:d3}: ", ++logindex);
string ToAppend = prefix + MyLogger.GetLastLog();
rtb_logger.AppendText(ToAppend);
if (ToAppend.Contains("Alert -"))
{
rtb_logger.SelectionStart = length;
rtb_logger.SelectionLength = ToAppend.Length;
rtb_logger.SelectionColor = Color.Red;
}
rtb_logger.AppendText(Environment.NewLine);
rtb_logger.SelectionStart = rtb_logger.TextLength;
rtb_logger.ScrollToCaret();
EnableControls();
}

在背景工作人员的以下调用中,崩溃发生在上面第一行注释为“文本末尾”的行:
MyLogger.Log("Sending cmd: \"" + strCmdText + "\" to CMD.exe.");

如何使MyLogger类具有线程安全性?

编辑:使用SeeSharp解决方案,代码更改为:
private void MyLogger_LogAdded(object sender, EventArgs e)
{
if (rtb_logger.InvokeRequired)
{
rtb_logger.BeginInvoke(new Action(delegate {
MyLogger_LogAdded(sender, e);
}));
return;
}
int length = rtb_logger.TextLength; // at end of text
string prefix = string.Format("{0:d3}: ", ++logindex);
string ToAppend = prefix + MyLogger.GetLastLog();
rtb_logger.AppendText(ToAppend);
if (ToAppend.Contains("Alert -"))
{
rtb_logger.SelectionStart = length;
rtb_logger.SelectionLength = ToAppend.Length;
rtb_logger.SelectionColor = Color.Red;
}
rtb_logger.AppendText(Environment.NewLine);
rtb_logger.SelectionStart = rtb_logger.TextLength;
rtb_logger.ScrollToCaret();
EnableControls();
}

最佳答案

您必须在UI线程中调用MyLogger_LogAdded的主体。
调用rtb_logger的方法或属性时,请尝试使用Dispatcher.BeginInvoke()。

参见C#: Thread safe richtextbox event logging method?

关于c# - 从后台工作人员登录MyLogger时发生跨线程InvalidOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15183307/

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