浏览:12442008-03-13 16:33   来自沙加      :
俺刚接触做WinForm, 以前是做Web的,问题是这样,现在有一个功能,点界面上的一个按钮执行一项功能,但是这个操作需要较长的时间,我现在未作任何处理,这时候界面上就跟死了似的. 半天无响应,但是程序实际上是在工作的. 应该有解决办法吧? 我想是不是另开一个线程去执行这个任务呢(就不会造成界面定住??), 或者使用异步的方式,并且我希望能够了解一些执的进度,比如加一个进度条, 如何反映到界面上来??
楼主
  4个月前   分享      :
原来windows有个系统调用可以让界面保持控制,最简单。

另外一个办法就是开线程。

进度条是个简单问题。
回复  1楼 回到顶楼 
  4个月前   沙加      :
@分享
进度条我想的是把任务操作封装到一个类里面, 然后公开一个事件, 把当前进度或者相关数据放到事件参数里面,界面上定阅这个事件后再把进度呈现出来,这样做可以吗?
回复  2楼 回到顶楼 
  4个月前   被偷De贼      :
Application.DoEvents();

回复  3楼 回到顶楼 
  4个月前   G yc {Son of VB}      :
Application.DoEvents();
是一个不错的方法,
还可使用 多线程或者异步
使用多线程跟新界面,需要使用Invoke才可以
使用异步,更新界面我没有试过

.NET 2.0中,有个backgroundwork 控件,可以实现多线程,和更新(需要配置)
回复  4楼 回到顶楼 
  4个月前   BirdsHover      :
开多线程,用委托通知界面
回复  5楼 回到顶楼 
  4个月前   Risen      :
BackgroundWorker 是.net 2.0新增控件,对于快速实现异步调用非常有用,建议详查MSDN中的BackgroundWorker控件。
回复  6楼 回到顶楼 
  3个月前   jisen      :
一般解决方法都是创建委托,然后在委托方法A里面执行任务,然后在A中启用刷新进度条,但是要注意跨线程操作控件的问题,这个还要用委托来解决。
回复  7楼 回到顶楼 
  1个月前   念念红尘      :
可以通过多线程来解决这个问题,新开一个线程来执行比较费时间的操作。因为有2个线程,系统会进行调度,线程轮流获得CPU时间,这样就不会出现界面假死的现象。

一般有3种方法:
1:Thread新建一个线程,可以自己控制
2:用线程池,交给系统控制
3:利用异步(异步实际是多线程的一种应用,他实际是使用了线程池)

关于显示进度,可以使用事件。
另外的方法是在异步的线程中使用一个回调方法,这个回调方法是更新界面进度的。如果要实时显示,我觉得可以使用Therd.Timer,阁段时间执行一次回调函数,也就是刷新。
回复  8楼 回到顶楼 

你还不是小组成员,加入小组以后才能发布新主题!
1 13901