【发布时间】:2010-09-26 11:37:00
【问题描述】:
在我的应用程序中,我有 6 个数组,它们代表我的应用程序执行的 6 个作业。每个作业基本上都与数据库交互并填充数组的每个元素。
我所做的是创建 6 个线程并使 6 个数组全局化,以便线程可以填充它们。我还创建了一个包含 6 个 bool 元素的数组(ThreadsAlive)。当一个线程完成它的执行时,它在 bool 数组中设置一个标志.我创建了一个作业监视线程(threadwatcher)来监视这个布尔线程。当该数组中的所有元素都设置为false时,我将确保我的作业已完成。
现在,问题是,由于 Oledb 驱动程序中的一些错误,ExecuteReader() 语句卡在某个线程中并且永远不会恢复,我的应用程序将永远继续。实际上,可以“解决”错误可以重新启动该特定作业。下次该作业可能会成功运行。
我的计划是我将所有 6 个线程作为字段,并与 ThreadsAlive 数组一起,我还将维护一个 DateTime 的 LastActivityOfThreads 数组。
所有作业线程在执行查询时都会更新该数组中的时间。现在我的作业观察线程将监视任何线程的最后活动时间是否超过 3 分钟前。如果发生这种情况,它将杀死该线程并重新启动它。
只是想知道如何在不引发异常的情况下杀死任何线程。
更新:我这样做了,它显示“线程被中止”的异常
更新:也许我为每个操作使用单独的进程(exe),并在主应用程序中不断监视进程。如果一个进程比平时花费更长的时间,我会杀死该进程并重新启动它。
但在这种情况下,运行的 6 个进程将如何给我 6 个数组的数据?
更新:是否有可能在池中,如果我发现任何线程挂起,我会使用
th = new Thread(Fun_Name) 并让旧线程在原处。
【问题讨论】:
-
您应该维护一个基于计数器的同步对象,例如信号量,而不是维护一个由六个布尔值组成的数组并不断地轮询它们。这样,您可以在六个线程上进行更有效的等待。也许更简单,你可以循环六个 Join()s。
-
实际上问题不在于同步,而是我想以某种方式克服的 ExecuteReader 中的错误。
-
我认为你不应该做这种复杂的事情来避免 ExecuteReader 中的错误,我实际上认为你更有可能滥用它。我建议您发布另一个与 ExecuteReader 相关的问题,看看它是否真的是一个错误,而不仅仅是“用户错误”。
标签: c# multithreading