【发布时间】:2017-04-04 18:29:26
【问题描述】:
我有一个控制台应用程序,它在不同的线程中启动一个表单应用程序(来自另一个类)。
但是,我不想在主线程中从我的主类访问 richTextBox1 组件,这会引发错误,表明我正在尝试从另一个线程访问该组件。
我的代码: (表格申请)
public partial class ChatGui : Form
{
public static RichTextBox textBox;
public ChatGui()
{
InitializeComponent();
richTextBox1.ReadOnly = true;
richTextBox1.BackColor = SystemColors.Window;
}
public void WriteLine(string line)
{
richTextBox1.Text += line+"\r\n";
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
WriteLine("[You]: "+textBox1.Text);
NetworkManager.SendPacket("rchat_msg " + textBox1.Text.Replace(" ", "%20"));
textBox1.Text = "";
e.Handled = true;
}
}
public void Exit()
{
Application.Exit();
}
private void ChatGui_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
}
}
主控制台应用程序
public static void StartRemoteChat()
{
RemoteChat = true;
Program.ChatGui = new ChatGui();
new Thread(new ThreadStart(() =>
{
Application.Run(Program.ChatGui);
while (RemoteChat)
{
// ...
}
})).Start();
}
那么,如何从我的主线程访问richTextBox1 组件(我想更改组件的一些变量)而不发生此错误?
【问题讨论】:
-
附带说明,
Application.Run()是一个阻塞调用。在聊天表单关闭之前,您的while (RemoteChat)循环将不会被点击! -
@Idle_Mind 哦,你是对的!谢谢!
标签: c# multithreading winforms console-application