none
如何在执行费时动作的时候 可以较快的响应画面其它部分动作。 RRS feed

  • 问题

  • 问题是这样的,开发的一个画面是 WinForm的有,在一个Tab页有5个根据DB数据生成图形的Tab

    现在问题是当点击Tab1 生成数据时 由于这个时间较长 大约需要3分钟左右,因此希望可以切换到别的Tab页面去,进行别的动作。但是 现在做完后的效果是 大约需要 10秒以上才能切换过去,这个时间有些太长了,又没有什么办法 可以在3秒内切换过去的呢?

    现在已经使用了 System.Windows.Forms.Application.DoEvents(); 来解决这个问题,但是感觉效果不太好,因为目前的认识是这个语句放在 For 循环部分控制比较有效,但是现在 这个程序除了for循环外其它部分在执行的时候也较费时,哪位知道 方法请说一下。

     

    2010年4月1日 4:12

答案

  • 你好!

         可以使用多线程来实现这个目的,你可以自己建立一个线程,或是使用BackgroundWorker控件来执行耗时的任务!


    周雪峰
    2010年4月1日 11:17
    版主
  • 好像除了多线程没什么好办法了吧,fill又不能分。

    其实多线程也很简单的,只要在调用控件的时候invoke一下方法就可以了。

    ThreadStart ts = new ThreadStart(function1);

    Thread t = new Thread(ts);

    t.Run();


    霸王
    2010年4月2日 9:23

全部回复

  • 用backgrouondworker 去做费时间的活,界面就没有任何影响了。这样的话还可以几个活同时干(如果资源允许的话)
    霸王
    2010年4月1日 10:01
  • 你好!

         可以使用多线程来实现这个目的,你可以自己建立一个线程,或是使用BackgroundWorker控件来执行耗时的任务!


    周雪峰
    2010年4月1日 11:17
    版主
  • 目前大家说得方法 都是采取多线程的方式,
    而 现在使用 System.Windows.Forms.Application.DoEvents();这个已经测试过了可以实现
    要求,但是现在由于又增加了 性能改善的部分,在执行System.Windows.Forms.Application.DoEvents();之前 做了一些从DB 取得数据放到DataTable的动作,所以使得反映变慢了。而且目前这个程序还需要
    点击"Canlcel"按钮结束当前的执行,这些在目前的版本都已经实现了
    所以 现在的想法是 又没有什么改动较小的方法 可以实现这个要求。
    程序的大致结构如下:
    private double function1()
    {
    DataTable dt1;
    DataTable dt2;

    //get the data from DG
    SQLiteDataAdapter sda1=new SQLiteDataAdapter(strSQL,Conn);
    sda1.fill(dt1);
    ........

    for (int i=0;i<dt1.rows.cou;i++)
    {
    System.Windows.Forms.Application.DoEvents();
    ........................
    }

    }
    2010年4月2日 9:14
  • 好像除了多线程没什么好办法了吧,fill又不能分。

    其实多线程也很简单的,只要在调用控件的时候invoke一下方法就可以了。

    ThreadStart ts = new ThreadStart(function1);

    Thread t = new Thread(ts);

    t.Run();


    霸王
    2010年4月2日 9:23