我正在使用多个FileSystemWatcher
个对象来观看多个目录。
当我对已查看的文件夹执行复制和粘贴操作时,FileSystemWatcher
会为每个创建的新文件引发Created
事件文件,我捕获。
我使用并行为 n 的线程池来排队作业并控制我想要的线程数它(我可以一次创建200个文件,但是,我只希望4个线程适用于它)。 "的它"意味着计算校验和:
private byte[] calculateChecksum(string frl)
{
byte[] checksum = null;
FileStream stream = null;
try
{
stream = File.Open(frl, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
MD5 md5 = MD5.Create();
checksum = md5.ComputeHash(stream);
}
finally
{
stream.Close();
}
return checksum;
}
问题在于,有时当一个线程正在处理该作业(calculateChecksum
方法)时,它会尝试访问文件,但是,有时文件正在使用中(我支持SO)。 / p>
我想设置一个解决方案,以解决这个问题告诉我:" 稍后再尝试"。
一种解决方案是,再次将线程池上的作业排入队列。问题是我不知道如何告诉 以后 。我认为这很重要,因为我不想让它呼吸并在短时间内休息并稍后再次尝试。
例如:
FileSystemWatcher
提出了一个事件。我不想要:等待300秒表示线程池的线程正忙。它不允许派遣其他排队的工作。
我不知道我是否已经清楚了。 任何想法
答案 0 :(得分:2)
基本上你想要一个带定时器的重试模式。
你可以通过Polly轻松地做到这一点:
// Retry, waiting a specified duration between each retry
Policy
.Handle<DivideByZeroException>()
.WaitAndRetry(new[]
{
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(2),
TimeSpan.FromSeconds(3)
});
https://github.com/App-vNext/Polly
或者喜欢没有polly的人: