因此,使用Windows窗体构建器,我创建了一个带有文本框的新窗体,将此窗体称为LogForm.cs,此窗体/类具有一个名为log(字符串文本)的方法。
在我的主窗体类(Form1.cs)中,我创建了该窗体的一个实例。
LogForm logForm = new LogForm();
logForm.log("Logger has started...");
它在LogForm文本框上显示正常。但是当我在一个线程中调用logForm.log("Some logging info...")
我的代码时,它会以某种方式使我的应用程序崩溃。
我该如何处理?请帮我演示一个小代码。我对C#和整个编程都很陌生,所以我希望你考虑一下。
在LogForm.log
中使用/调用此函数(C#中的btw方法通常是大写的)。
private void SetText(string text)
{
Action set = () => yourTextBox.Text = text;
if (yourTextBox.InvokeRequired)
{
yourTextBox.Invoke(set);
}
else
{
set.Invoke();
}
}
如果无法从当前线程设置yourTextBox.InvokeRequired
将为true,该函数将解决它。否则它只是直接设置它。
来自this answer的possible duplicate的灵感。
既然你说这个问题仍然存在,我会展示更多的代码并尝试进一步说明。
首先,我编辑了SetText
方法。我添加了私有修饰符,因为这个函数没有在LogForm
之外的任何地方被调用。我还添加了大括号,因为这是我的首选样式,它还确保if语句按预期运行。
public void Log(string message) {
SetText(message);
//do stuff
}
这两种方法(Log
和SetText
)都放在LogForm
类中。现在,只要您的表单(包含文本框)已经初始化,您就可以从任何线程调用logForm.Log("Logger has started...");
。这通常在构造函数中通过在第一行调用InitializeComponent();
来实现。
在不了解您的代码的情况下,这可能是我可以帮助您的。