多线程帮助,再次(winForms)

Posted

技术标签:

【中文标题】多线程帮助,再次(winForms)【英文标题】:Multithreading help, yet again (winForms) 【发布时间】:2010-10-22 16:43:00 【问题描述】:

我开发了一个应用程序,每 X 个线程从我的数据库中提取 X 个记录。然后每个线程迭代创建的集合并对每条记录进行一些数据验证。 一旦记录被应用程序验证/未验证,它将在数据库中更新为有效/无效。仅当数据库中存在尚未通过应用程序运行的项目时,每个线程才会提取记录。有一个位列指示应用程序是否检索到数据。 因此,系统可能会根据线程数和每个线程的记录数用尽数据。我希望应用程序继续检查数据库中是否有任何尚未运行的记录,然后开始创建线程的过程,最后验证数据。

这是一个例子: 数据库中有50条记录 我们正在运行 5 个线程,每个线程有 10 条记录。 应用程序运行,线程被创建,记录被提取然后处理。现在,系统数据不足。用户将更多数据导入数据库。应用程序仍在查看是否有任何记录,发现数据库中有 5 条新记录。然后它重新启动进程以创建线程并处理记录。

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

while(RecordsFound <=0)
 …sleepcode
 ;
RunProcessMethod

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

【问题讨论】:

【参考方案1】:

解决此问题的最简单方法是使用通知机制而不是轮询。也就是说,一旦您产生线程以从数据库读取数据,就让它们负责在它们完成时通知 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

【讨论】:

【参考方案2】:

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

您不必担心这一点。这是处理这种情况的正确方法。后台线程创建额外线程没有问题。

【讨论】:

以上是关于多线程帮助,再次(winForms)的主要内容,如果未能解决你的问题,请参考以下文章

winform 多线程

C# winform多线程案例

winform中的多线程问题

c# 多线程 ui winform界面

C# winform 多线程更新数据,UI卡顿现象。

C#winform使用了多线程,有时候程序再运行中直接就退出了!