2010-10-22 62 views
2

我开发了一个应用程序,每X线程的数量从我的数据库中提取X笔记录。然后每个线程迭代创建的集合并为每条记录进行一些数据验证。 一旦记录被应用程序验证/未验证,它将在数据库中更新为有效/无效。如果数据库中有尚未通过应用程序运行的项目,则记录仅由每个线程提取。有一列表示应用程序是否检索到数据。 因此,根据每个线程的线程和记录数量,系统可能会耗尽数据。我希望应用程序继续检查数据库中是否有未运行的记录,然后开始创建线程的过程,最后验证数据。多线程帮助,再次(winForms)

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

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

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

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

回答

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 
} 
+0

非常感谢!线程仍然让我感到害怕;) – DDiVita 2010-10-22 16:55:45

2

我尝试添加等待逻辑到另一个线程,但很害怕,如果我运行从该线程处理方法,通过委托,事情会因为我创建方法内额外的线程变得怪异。思考?

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