因此,使用Windows窗体构建器,我创建了一个带有文本框的新窗体,将该窗体称为LogForm.cs,此窗体/类具有一个称为log(string text)的方法。
在主窗体类(Form1.cs)中,我创建了该窗体的实例。
LogForm logForm = new LogForm();
logForm.log("Logger has started...");
,它在LogForm文本框中显示正常。但是,当我在线程内的代码上调用logForm.log("Some logging info...")
时,它会使我的应用程序崩溃。
我该如何处理?请帮我演示一小段代码。我对C#和整个编程还很陌生,希望您考虑一下。
答案 0 :(得分:0)
在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
方法。我添加了private修饰符,因为此功能并非要在LogForm
之外的任何地方调用。我还添加了大括号,因为这是我的首选样式,并且还可以确保if语句的行为符合预期。
public void Log(string message) {
SetText(message);
//do stuff
}
这两种方法(Log
和SetText
)都放在LogForm
类中。现在,只要您的表单(包含文本框)已经初始化,就可以从任何线程调用logForm.Log("Logger has started...");
。这通常在构造函数中通过在第一行调用InitializeComponent();
来实现。
在不进一步了解您的代码的情况下,这可能是我可以为您提供的最大帮助。