VB.NET While循环调用application.DoEvents一次

时间:2014-03-18 22:32:28

标签: .net loops user-interface while-loop

我正在制作一个涉及复制文件并在进度条和标签中显示统计数据的应用程序。目前我使用变量来保存当前进度,循环内的application.doevents以避免使应用程序无响应,以及从变量中恢复统计数据并更新GUI中的标签和进度条的计时器。有没有更好的方法呢?我担心while循环中的application.doevents有点代价......有没有办法只调用一次application.doevents?感谢。

2 个答案:

答案 0 :(得分:0)

如果你不想使用后台工作者,你可以用很少的数学来实现这一点。

for j=1 to 1000

     'your code

    if (j mod 25)=0 then  ' 
       Application.Doevents()
    endif

next

采用这种方法而不是点击doevents 1000次命中只有40次。

答案 1 :(得分:0)

除非你有充分的理由(并且我不知道),否则不要使用DoEvents。它可能不会在您的特定场景中引起任何问题,但一般来说,最好不要习惯使用它。快速谷歌搜索会找到很多关于这个主题的讨论。

更好的方法是使用BackgroundWorker来处理复制文件和更新变量,并使用Timer每秒更新一次GUI。

你把这样的东西放在一起......

BackgroundWorker Worker;
Timer UpdateTimer;

void Run()
{
    Worker = new BackgroundWorker();
    Worker.DoWork += Worker_DoWork;
    Worker.RunWorkerAsync();

    UpdateTimer = new Timer();
    UpdateTimer.Tick += UpdateTimer_Tick;
    UpdateTimer.Interval = 1000;
    UpdateTimer.Start();
}

void Worker_DoWork(object sender, DoWorkEventArgs e)
{
    //do file copying
}

void UpdateTimer_Tick(object sender, EventArgs e)
{
    //update gui
}

编辑:发布我的代码后实现的是C#,但您正在VB中工作。我并不熟悉VB语法,但这仍然适用。只需查看这两个课程的MSDN链接,您就应该开始了。