2008-08-15 41 views
4

我们的团队正在创建一个新的招聘工作流程系统来取代旧的。我的任务是将旧数据迁移到新模式中。我已经决定通过创建一个小型的Windows Forms项目来完成这个工作,因为架构完全不同,直接的TSQL脚本不是一个适当的解决方案。Windows窗体线程和事件 - ListBox更新迅速,但进度条经历了巨大的延迟

,它的工作声明了以下代表活动的主要密封类“ImportController”:

public delegate void ImportProgressEventHandler(object sender, ImportProgressEventArgs e); 
public static event ImportProgressEventHandler importProgressEvent; 

主窗口开始使用一个新的线程在类的静态方法:

Thread dataProcessingThread = new Thread(new ParameterizedThreadStart(ImportController.ImportData)); 
dataProcessingThread.Name = "Data Importer: Data Processing Thread"; 
dataProcessingThread.Start(settings); 

ImportProgressEvent args携带一个字符串消息,进度条的max int值和当前进度int值。 Windows窗体subcribes到事件:

ImportController.importProgressEvent += new ImportController.ImportProgressEventHandler(ImportController_importProgressEvent); 

,并用它自己的代表回应了这样的情况:

private delegate void TaskCompletedUIDelegate(string completedTask, int currentProgress, int progressMax); 

private void ImportController_importProgressEvent(object sender, ImportProgressEventArgs e) 
      { 
       this.Invoke(new TaskCompletedUIDelegate(this.DisplayCompletedTask), e.CompletedTask, e.CurrentProgress, e.ProgressMax); 
      } 

最后的进度条和列表框更新:

private void DisplayCompletedTask(string completedTask, int currentProgress, int progressMax) 
     { 
      string[] items = completedTask.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 

      foreach (string item in items) 
      { 
       this.lstTasks.Items.Add(item); 
      } 

      if (currentProgress >= 0 && progressMax > 0 && currentProgress <= progressMax) 
      { 
       this.ImportProgressBar.Maximum = progressMax; 
       this.ImportProgressBar.Value = currentProgress; 
      } 
     } 

事情是ListBox似乎更新非常快,但进度条永远不会移动,直到批处理几乎完成无论如何???是什么赋予了 ?

回答

0

@John

感谢您的联系。

@Will

有没有从threadpooling因为我知道它会永远只产卵一个线程增益。线程的使用纯粹是为了有一个响应式的用户界面,而SQL Server正在读取和写入。这当然不是一个短暂的线程。

关于大锤你是对的。但是,事实证明,我的问题毕竟在屏幕和椅子之间。我似乎有一批非常规的数据,比其他批次拥有许多许多更多的外键记录,并且恰好在流程的早期被选中,意味着currentProgress在10秒内不会获得++'d。

@All

感谢您的输入,它让我思考,这让我的代码,这导致了谦卑,我还没有证明我的AHAA时刻跳槽再次错误通常是人类:)

-1

您确保UI线程在这一切的过程中运转自如?即它没有被阻挡在加入或其他等待?这就是我看起来的样子。

使用BackgroundWorker的建议是一个很好的建议 - 绝对优于尝试通过加载刷新/更新调用来解决问题的方式。

而BackgroundWorker将使用一个池线程,这是比创建自己的短暂线程更友好的方式。

0

也许在范围之外,但有时它有用做一个Application.DoEvents();使GUI部件对用户输入做出反应,例如按下状态栏对话框上的取消按钮。

0

你有没有机会运行Windows Vista?我注意到在一些与工作相关的应用程序中完全一样的东西。不知何故,当进度条“动画”时似乎有延迟。

-1

有来自threadpooling作为 没有收获,我知道它仅会催生一个 线程。使用线程纯粹是 有一个响应式用户界面,而SQL 服务器正在读取和 写入。这当然不是简短的 住的线程。

好吧,我明白了,很高兴你找到了你的bug,但你看过BackgroundWorker吗?它几乎完全符合你在做什么,但是以标准化的方式(即没有你自己的代表)并且不需要创建一个新线程 - 两者都是(可能很小但可能仍然有用)的优点。