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

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

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

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

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

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

【问题讨论】:

    标签: c# winforms multithreading


    【解决方案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 方法,事情会变得很奇怪,因为我在该方法中创建了额外的线程。想法?

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

      【讨论】:

        猜你喜欢
        • 2011-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多