Dan*_*Dan 7 c# multithreading invoke winforms
所以我在我的应用程序中有一个线程,其目的是监听来自服务器的消息并根据它收到的内容采取行动.
当我想从服务器发出消息时遇到问题,当客户端应用程序收到消息时,客户端应用程序将打开一个新表单.然而,这个新形式立即冻结.
我认为正在发生的事情是新表单被加载到与监听服务器的线程相同的线程上,当然这是忙于监听流,然后阻塞线程.
通常,对于我在客户端监听线程中的其他函数,我会使用调用来更新主窗体的UI,所以我想我要求的是,如果这是一种在主窗体上调用新窗体的方法.
Jos*_*osh 16
我假设这是Windows窗体而不是WPF?在后台线程中,您不应尝试创建任何表单,控件等或操纵它们.这只能在运行消息循环并可以处理Windows消息的主线程中运行.
因此,要使代码在主线程而不是后台线程上执行,可以使用Control.BeginInvoke方法,如下所示:
private static Form MainForm; // set this to your main form
private void SomethingOnBackgroundThread() {
string someData = "some data";
MainForm.BeginInvoke((Action)delegate {
var form = new MyForm();
form.Text = someData;
form.Show();
});
}
Run Code Online (Sandbox Code Playgroud)
要记住的主要事情是,如果后台线程不需要主线程的任何响应,则应使用BeginInvoke,而不是Invoke.否则,如果主线程忙于等待后台线程,则可能会陷入死锁.
| 归档时间: |
|
| 查看次数: |
16929 次 |
| 最近记录: |