我们在3-4个不同的线程中运行一个长作业(函数)。所有正在运行的线程都已成功完成,但有时某个线程会抛出异常Thread was being aborted,这会导致所有线程停止。下面是我们在应用程序中实际执行操作的示例代码。
List<Thread> lstThreads = new List<Thread>();
foreach(int 0; i < 4; i++)
{
Thread th = new Thread(() => {
RunLongRunningJob(i);
});
lstThreads.Add(th);
}
foreach (Thread th in lstThreads)
th.Start();我们正在调用rest api,在RunLongRunningJob中写入文件并更新数据库记录。
附注:我们没有使用锁,这可能是原因吗?
发布于 2020-02-28 19:20:42
在C#中,线程根本不能停止,而不会产生副作用。想象一下,线程已经准备好了一次性物品,然后就停止了。作为一种变通方法,当线程中止时(你不应该这样做,但你可以在thread对象上调用),就会生成并执行ThreadAbortException。这允许异常处理踢入和关闭文件句柄等。
啊,终于找到了--这是一篇博客文章,解释了为什么你永远不应该调用Thread.Abort (即它不应该被应用程序代码调用):
http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation
这是关于时间和线程在真正糟糕的情况下最终没有正确执行的问题。
现在,必须找出导致线程中止的原因。这是一些需要检查的东西-异常细节将会有所帮助,包括堆栈跟踪和其中可能的内部异常。
https://stackoverflow.com/questions/60450604
复制相似问题