【问题标题】:Pause without freezing the application暂停而不冻结应用程序
【发布时间】:2011-12-26 05:55:41
【问题描述】:

我有一个循环,在该循环中我正在运行一个调度程序计时器。这是我的代码:

Dim dt As New DispatcherTimer
dt.Interval = TimeSpan.FromSeconds(5)
AddHandler dt.Tick, AddressOf ChangeLabel

Dim items as new List(Of String) From {"Apple","Orange","Banana"}
For Each i In List
 Me.Title = i     
 dt.StartTimer()
 System.Threading.Thread.Sleep(5000)
Next

Private Sub ChangeLabel
 'Show dt elapsed time in a label
End Sub

基本上我想要的是显示项目列表中的每个项目在每个项目后暂停 5 秒。我想在标签中显示经过的时间,在经过的时间达到 5 秒后显示下一个项目。使用 Thred.Sleep 方法这是不可能的,因为它只会冻结我的应用程序 5 秒,并显示下一个项目,而无需使用经过时间更新标签。

那么用什么来代替 Thread.Sleep 来不冻结应用程序并用经过的时间更新标签?

【问题讨论】:

  • 否;您需要使用事件或线程。
  • 根本问题是什么? (你最终想做什么?)
  • @jberger 我正在尝试遍历列表中的所有项目,在标签中一次显示一个。我想在每个项目后暂停 5 秒钟,然后显示下一个。
  • 在更改当前显示的标签之间“暂停 5 秒”或“间隔 5 秒”?

标签: .net wpf vb.net


【解决方案1】:

我会从BackgroundWorker 开始。这里有一些东西(在 C# 中)可以帮助您入门。 (VB中的代码应该很相似。)

 worker = new BackgroundWorker();
 worker.DoWork += (sender, doWorkEventArgs) =>
 {// stuff to do during every iteration of background worker (long-running process)
      #region DoWork
      foreach(string label in labels)
      {
          worker.ReportProgress(0, label);
          Thread.Sleep(5000);// 5-sec sleep on bg thread
      }
      #endregion DoWork
 };
 worker.ProgressChanged += (sender, e) =>
 {
      #region DoWork Progress (executed on UI thread, so invoke not required)
      string text = e.UserState as string;
      //update control
      #endregion DoWork Progress (executed on UI thread, so invoke not required)
 };               
 worker.RunWorkerAsync(null);// start background worker

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2011-02-09
    • 2013-05-30
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多