gpt4 book ai didi

c# - 多线程帮助,再次 (winForms)

转载 作者:行者123 更新时间:2023-11-30 21:18:58 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

执行此操作的最简单方法是传递一个委托(delegate),供线程在完成找到的记录集时调用。用户界面可以在记录可用时更新

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
}

关于c# - 多线程帮助,再次 (winForms),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3999020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com