[英]Backgroundworker acting weird?
我目前正在处理一个多线程项目,该项目涉及多个并行运行的耗时任务。
每个任务都记录在同一个文件中,我需要保持整洁(以正确的顺序),所以我找到了一种“逐个任务”记录的方法:
_logList[id].Add(message)
Thread.CurrentThread.ManagedThreadId
下面是我如何启动我的 BackgroundWorkers:
foreach (MyTask task in List<MyTask> tasks)
{
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += bgworker_DoWork;
bg.RunWorkerCompleted += bgworker_RunWorkerCompleted;
List<object> arguments = new List<object>() { task, args1 };
bg.RunWorkerAsync(arguments);
}
bgworker_DoWork 委托是耗时的任务,写日志。
然后,当一个任务结束时,BackgroundWorker 运行委托 bgworker_RunWorkerCompleted,它基本上以正确的顺序结束任务并写入相应的日志:
Log.FlushWrite((int)result[2]); -- result[2] contains the threadId to flush
而 FlushWrite 只将 threadId 的日志列表写入日志文件:
WriteMessageToFile(_logList[id]);
大多数情况下,这是有效的。 但有时,我会看到一种奇怪的行为:
我知道托管线程 id 可能会被回收和重用,但是发生这种情况的唯一方法是当运行的 BackgroundWorker 尚未调用RunWorkerCompleted
时该线程已经被重用(对DoWork
新调用)
我对吗? 这种情况有什么我不明白的地方吗?
也许在这种情况下使用 ManagedThreadId 作为字典的键是一种不好的做法?
谢谢你的帮助 :)
我发现了我的问题:在FlushWrite
操作期间,执行了锁定。 如果这个worker等待的时间太长,另一个worker可能会写到同一个ThreadID,导致这种情况下的flush操作不一致。
通过使用另一本字典解决,仅用于刷新“完整的工人”。
还重写了代码以将BackGroundWorker
更改为Task.Run
。 谢谢 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.