同时牢记:
- 我正在使用一个阻塞队列,它一直等待直到添加一些东西
- 我可能会收到两次 FileSystemWatcher 事件
更新后的代码:
{
FileProcessingManager processingManager = new FileProcessingManager();
processingManager.RegisterProcessor(new ExcelFileProcessor());
processingManager.RegisterProcessor(new PdfFileProcessor());
processingManager.Completed += new ProcessingCompletedHandler(ProcessingCompletedHandler);
processingManager.Completed += new ProcessingCompletedHandler(LogFileStatus);
while (true)
{
try
{
var jobData = (JobData)fileMonitor.FileQueue.Dequeue();
if (jobData == null)
break;
_pool.WaitOne();
Application.Log(String.Format("{0}:{1}", DateTime.Now.ToString(CultureInfo.InvariantCulture), "Thread launched"));
Task.Factory.StartNew(() => processingManager.Process(jobData));
}
catch (Exception e)
{
Application.Log(String.Format("{0}:{1}", DateTime.Now.ToString(CultureInfo.InvariantCulture), e.Message));
}
}
}
考虑到两个相同的字符串路径可能被添加到阻塞队列中的可能性,你对使代码多线程有什么建议?我已经留下了可能发生这种情况的可能性,在这种情况下..文件将被处理两次,问题是有时我得到两次,有时没有,这真的很尴尬,如果您对此有建议,请告诉。
空值检查是为了退出循环,我故意从线程循环外部添加一个空值来确定它停止。