多线程帮助,再次(winForms)

时间:2010-10-22 16:43:01

标签: c# winforms multithreading

我开发了一个应用程序,每X个线程数从我的数据库中提取X个记录。然后,每个线程迭代创建的集合,并为每个记录执行一些数据验证。 一旦记录被应用程序验证/未验证,它将在数据库中更新为有效/无效。如果数据库中的项目尚未通过应用程序运行,则每个线程仅提取记录。有一列表示应用程序是否检索了数据。 因此,潜在地,系统可能会耗尽数据,具体取决于每个线程的线程数和记录数。我希望应用程序继续检查数据库中是否有任何未运行的记录,然后启动创建线程的过程,最后验证数据。

这是一个例子: 数据库中有50条记录 我们运行5个线程,每个线程有10条记录。 应用程序运行,创建线程,拉取记录然后处理。现在,系统没有数据。用户将更多数据导入数据库。该应用程序仍在查看是否有任何记录,发现数据库中有5条新记录。然后它开始遍历该过程以创建线程并处理记录。

如何让系统继续查找数据,但允许用户在需要时停止系统。我试过用这个:

while(RecordsFound <=0){
 …sleepcode
} ;
RunProcessMethod

但在等待期间,winform显然会锁定。我尝试将等待逻辑添加到另一个线程,但是担心如果我从该线程运行进程方法,通过委托,事情就会变得奇怪,因为我在该方法中创建了额外的线程。 想法?

2 个答案:

答案 0 :(得分:2)

  

我尝试将等待逻辑添加到另一个线程,但是担心如果我从该线程运行进程方法,通过委托,事情就会变得奇怪,因为我在该方法中创建了额外的线程。想法?

你不必担心这个。这是处理这种情况的正确方法。后台线程创建其他线程没有问题。

答案 1 :(得分:2)

解决此问题的最简单方法是使用通知机制而不是轮询。这就是一旦你从线程中产生了从数据库中读取数据,让它们负责在UI完成时通知UI,而不是让UI等待它们完成。

最简单的方法是传入一个委托,让线程在完成找到的记录集时调用。然后,UI可以在记录可用时更新

delegate void CallBack(List<Data> found);

void OnDataFound(List<Data> found) {
  // Get back on the UI thread
  if ( this.InvokeRequired ) { 
    this.Invoke( new CallBack(OnDataFound), new object[] { found } );
    return;
  } 

   // Update display
}