C# 一个窗体ShowShowDialog另一窗体后,如何在前一个窗体关闭ShowDialog那个窗体

heather_z 2011-03-23 04:43:34
C# 一个窗体ShowShowDialog另一窗体后,如何在前一个窗体关闭ShowDialog那个窗体
网上搜了一些资料,说到解决方法是使用多线程,有谁可以给个例子,谢谢。
...全文
899 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
heather_z 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zerodegrees 的回复:]

引用 13 楼 heather_z 的回复:
zerodegrees,很感谢你,能说下ShowDialog方式中多线程解决思路吗?

介个我就不清楚了,O(∩_∩)O~
快下班了,see you!
[/Quote]
哦,谢谢!那个线程池的方法,
WaitCallback waitCallback = new WaitCallback(this.InvokeMethod);
我这里InvokeMethod是一个委托,好像参数不匹配...~~~~(>_<)~~~~
zerodegrees 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 heather_z 的回复:]
zerodegrees,很感谢你,能说下ShowDialog方式中多线程解决思路吗?[/Quote]

介个我就不清楚了,O(∩_∩)O~
快下班了,see you!
zerodegrees 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 heather_z 的回复:]
另外,请问zerodegrees:
C# Show和ShowShowDialog什么区别导致Show在处理大量数据时出现假死现象而ShowShowDialog不受此影响
[/Quote]

说实话,这个我还确实不是很清楚,我按我的理解说说吧。
show和showdialog的线程机制是不一样的。
showdialog的时候f1无法操作,所以f1不会占用太多的界面资源。
show的时候f1和f2会同时占用界面资源。
heather_z 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zerodegrees 的回复:]

引用 10 楼 heather_z 的回复:
谢谢,设计需要,f1是需要一直运行呢,相当于一个传输控制中心,不是通过关闭f1来关闭f2而是在f1中关闭f2,f1不关闭。
这样的话,不推荐用showdialog,你用show()+线程池吧,应该能解决的。
如果用showdialog会用到很麻烦的多线程编程,也能解决,但比上面那个要麻烦多了。
[/Quote]
zerodegrees,很感谢你,能说下ShowDialog方式中多线程解决思路吗?
zerodegrees 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 heather_z 的回复:]
谢谢,设计需要,f1是需要一直运行呢,相当于一个传输控制中心,不是通过关闭f1来关闭f2而是在f1中关闭f2,f1不关闭。[/Quote]
这样的话,不推荐用showdialog,你用show()+线程池吧,应该能解决的。
如果用showdialog会用到很麻烦的多线程编程,也能解决,但比上面那个要麻烦多了。
heather_z 2011-03-23
  • 打赏
  • 举报
回复
另外,请问zerodegrees:
C# Show和ShowShowDialog什么区别导致Show在处理大量数据时出现假死现象而ShowShowDialog不受此影响
heather_z 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zerodegrees 的回复:]

引用 7 楼 heather_z 的回复:
你提到的简单测试肯定是没有问题的,我这里前一个窗体需要和后一个窗体之间一直保持数据传输,从而产生的Show和ShowShowDialog的区别,不知道区别在哪里...

C# code

void DoWithCommon()
{
WaitCallback waitCallback = new WaitC……
[/Quote]
谢谢,设计需要,f1是需要一直运行呢,相当于一个传输控制中心,不是通过关闭f1来关闭f2而是在f1中关闭f2,f1不关闭。
zerodegrees 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 heather_z 的回复:]
你提到的简单测试肯定是没有问题的,我这里前一个窗体需要和后一个窗体之间一直保持数据传输,从而产生的Show和ShowShowDialog的区别,不知道区别在哪里...[/Quote]


void DoWithCommon()
{
WaitCallback waitCallback = new WaitCallback(this.InvokeMethod);
ThreadPool.QueueUserWorkItem(waitCallback);
}
InvokeMethod(object x)
{

}


上面那段代码可解决界面卡死问题。我不明白的是你不关闭f2,却想通过关闭f1来关闭f2,这是为什么呢?
从C/S架构的原理上说不通啊。
heather_z 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zerodegrees 的回复:]

引用 4 楼 heather_z 的回复:
引用 3 楼 zerodegrees 的回复:

ShowDialog本身就是为了让你只能操作被ShowDialog的窗体,“被”ShowDialog的窗体不关闭,那打开它的窗体是不能操作的。如果你想实现你所说的功能,直接用show方法不就好了吗?为什么还要用ShowDialog呢?

我使用Show的方式为什么界面是空白,包括窗体中的控件都……
[/Quote]
有道理,线程池没用过,是自定义数据缓冲区吗?还是.NET中间已经定义好的类库可供使用?
heather_z 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zerodegrees 的回复:]

引用 2 楼 heather_z 的回复:
引用 1 楼 bdmh 的回复:

不能,这个窗体自己关了不就行了,modal后,你也操作不了别的窗体了,除非用定时器操作

这个必须等待前一个窗体收到关闭ShowShowDialog命令才能关闭,时间是不可预知的,另外问一下,我使用Show的方式为什么界面是空白,而使用ShowShowDialog却没有这个问题,谢谢


用show(……
[/Quote]
你提到的简单测试肯定是没有问题的,我这里前一个窗体需要和后一个窗体之间一直保持数据传输,从而产生的Show和ShowShowDialog的区别,不知道区别在哪里...
zerodegrees 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 heather_z 的回复:]
引用 3 楼 zerodegrees 的回复:

ShowDialog本身就是为了让你只能操作被ShowDialog的窗体,“被”ShowDialog的窗体不关闭,那打开它的窗体是不能操作的。如果你想实现你所说的功能,直接用show方法不就好了吗?为什么还要用ShowDialog呢?

我使用Show的方式为什么界面是空白,包括窗体中的控件都不显示了,而使用ShowShowDialog却没……
[/Quote]

如果你show的时候有大量的数据在处理,那么那些数据处理就会占用界面资源,导致界面卡死。
使用线程池可以解决此问题。
zerodegrees 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 heather_z 的回复:]
引用 1 楼 bdmh 的回复:

不能,这个窗体自己关了不就行了,modal后,你也操作不了别的窗体了,除非用定时器操作

这个必须等待前一个窗体收到关闭ShowShowDialog命令才能关闭,时间是不可预知的,另外问一下,我使用Show的方式为什么界面是空白,而使用ShowShowDialog却没有这个问题,谢谢
[/Quote]

用show()应该是没有任何问题的,至于为什么是空白的,估计是你程序有bug。
你可以用简单的测试程序试一下:
在窗体1的button_Click时间中这么写:
From2 f2 = new Form2();
f2.Show();
heather_z 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zerodegrees 的回复:]

ShowDialog本身就是为了让你只能操作被ShowDialog的窗体,“被”ShowDialog的窗体不关闭,那打开它的窗体是不能操作的。如果你想实现你所说的功能,直接用show方法不就好了吗?为什么还要用ShowDialog呢?
[/Quote]
我使用Show的方式为什么界面是空白,包括窗体中的控件都不显示了,而使用ShowShowDialog却没有这个问题,数据可以正常显示,不知道为什么,好像是UI线程的问题。
zerodegrees 2011-03-23
  • 打赏
  • 举报
回复
ShowDialog本身就是为了让你只能操作被ShowDialog的窗体,“被”ShowDialog的窗体不关闭,那打开它的窗体是不能操作的。如果你想实现你所说的功能,直接用show方法不就好了吗?为什么还要用ShowDialog呢?
heather_z 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]

不能,这个窗体自己关了不就行了,modal后,你也操作不了别的窗体了,除非用定时器操作
[/Quote]
这个必须等待前一个窗体收到关闭ShowShowDialog命令才能关闭,时间是不可预知的,另外问一下,我使用Show的方式为什么界面是空白,而使用ShowShowDialog却没有这个问题,谢谢
bdmh 2011-03-23
  • 打赏
  • 举报
回复
不能,这个窗体自己关了不就行了,modal后,你也操作不了别的窗体了,除非用定时器操作

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧