Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
窗体的C#窗体位于单独的线程上_C#_.net_Winforms_Multithreading_C# 4.0 - Fatal编程技术网

窗体的C#窗体位于单独的线程上

窗体的C#窗体位于单独的线程上,c#,.net,winforms,multithreading,c#-4.0,C#,.net,Winforms,Multithreading,C# 4.0,我有个奇怪的问题 我有三张表格。 表格一,表格二,表格三 form1是起始/主窗体。 在表格1中,我有代码: form2 f2 = new form2; f2.ShowDialog(); form3 f3 = new form3; DialogResult result = f3.ShowDialog(); form2打开时,我不能专注于foorm1,它们都在同一个线程上。正是我想要的 在表格2中,我有代码: form2 f2 = new form2; f2.ShowDialog(); f

我有个奇怪的问题

我有三张表格。 表格一,表格二,表格三

form1是起始/主窗体。 在表格1中,我有代码:

form2 f2 = new form2;
f2.ShowDialog();
form3 f3 = new form3;
DialogResult result = f3.ShowDialog();
form2打开时,我不能专注于foorm1,它们都在同一个线程上。正是我想要的

在表格2中,我有代码:

form2 f2 = new form2;
f2.ShowDialog();
form3 f3 = new form3;
DialogResult result = f3.ShowDialog();
我运行此代码并。。。 对于一些人来说,我不知道为什么这个form3在新线程上运行,我可以专注于form2。 我不想发生这种事。我不知道为什么这个form3在新线程上运行。我无法使用DialogResult,因为它会导致错误(交叉线程)

它的行为就像我在使用f3.Show()但我在使用f3.ShowDialog()

比你提前

附言

如果我使用

form3 f3 = new form3;
DialogResult result = f3.ShowDialog(this);
我明白了:

System.InvalidOperationException为 未由用户代码处理
消息=未执行跨线程操作 有效:控件“form2”是从 线程,而不是原来的线程 创建于

在这一行:

DialogResult result = f3.ShowDialog(this);

对话框通过实现自己的消息循环来运行。由于两个线程都有一个处理消息的消息循环,因此启用了两个对话框。手动禁用第一个对话框或从同一线程创建并显示所有对话框我强烈建议您在一个线程中完成所有UI。请查看InvokeRequired和Invoke控件成员。

为什么您认为它们位于不同的线程上?@Conrad Frinx这是一个愚蠢的问题。您可以在窗体上显示线程数,甚至可以在窗体中检查线程数ProcExplorer@Hooch. 我不是那个有问题的人。@Conrad Frix Sory,但我正试图在没有运气的情况下修复它。@Hooch:Conrad的问题一点也不愚蠢。如果你真的检查(就像我刚才完全肯定的那样),你会看到对话框和打开它的窗口运行在同一个线程中,这是不正确的。对话框没有自己的消息循环,它使用与从中打开的窗口相同的消息循环。只有一个线程。实际上它是正确的:它有自己的消息循环。否则,ShowDialog函数在对话框关闭之前如何不返回?注意,我没有说它有自己的消息队列。消息队列为每个线程。Win32对话框也是如此:请参阅DialogBox函数。我是在单线程中完成这一切的。函数ShowDialog()在同一线程上创建窗体。如何解决这个问题?我相信你刚才说form3对象是在一个单独的线程上创建的?您收到的例外情况肯定说明了这一点。异常的完整堆栈跟踪是什么?