我有Winforms
應用程序,閱讀一些網絡文件夾和搜索該文件夾中的文件,這個功能得到List<stirng> folders
:如何知道什麼時候我所有的生產者 - 消費者作業完成
private decimal _numberOfFiles;
private static List<string> _folders;
public delegate void OnFileAddDelegate(List<string> files);
public event OnFileAddDelegate OnFileAddEventHandler;
public delegate void OnFinishSearchDelegate();
public event OnFinishSearchDelegate OnFinishSearchEventHandler;
public void SearchFiles()
{
foreach (string folder in _folders)
{
if (Directory.Exists(folder))
{
var files = Directory.EnumerateFiles(folder, "*.doc", SearchOption.TopDirectoryOnly)
.OrderByDescending(x => new FileInfo(x).CreationTime).Take((int)_numberOfFiles).ToList<string>();
if (OnFileAddEventHandler != null)
OnFileAddEventHandler(files);
}
}
if (OnFinishSearchEventHandler != null)
OnFinishSearchEventHandler();
}
後OnFileAddEventHandler(files)
事件被激發我ProducerConsumer
類開始檢查這List
是找到的文件和所做的工作(如果文件被確定解僱了事件到我的主UI添加這個文件到我的ListView
):
public class ProducerConsumer
{
public delegate void OnFileAddDelegate(PcapFileDetails pcapFileDetails);
public event OnFileAddDelegate OnFileAddEventHandler;
public delegate void AllFilesProcessedDelegate();
public event AllFilesProcessedDelegate AllFilesProcessedEventHandler;
private readonly Queue<string> _queue;
private int counter;
public ProducerConsumer(int workerCount, IEnumerable<string> list)
{
_isSearchFinished = true;
_queue = new Queue<string>(list); // fill the queue
counter = _queue.Count; // set up counter
for (int i = 0; i < workerCount; i++)
Task.Factory.StartNew(Consumer);
}
private void Consumer()
{
FileChecker fileChecker = new FileChecker();
for (; ;)
{
string file;
lock (_queue)
{
// synchronize on the queue
if (_queue.Count == 0) return; // we are done
file = _queue.Dequeue(); // get file name to process
} // release the lock to allow other consumers to access the queue
// do the job
string result = fileChecker.Check(file); // Check my file
if (OnFileAddEventHandler != null && result) // In case my file OK, fired up event to my main UI
OnFileAddEventHandler(file);
// decrement the counter
if (Interlocked.Decrement(ref counter) != 0)
continue; // not the last
// all done - we were the last
if (AllFilesProcessedEventHandler != null)
AllFilesProcessedEventHandler();
return;
}
}
}
現在,此搜索正在進行中,我的用戶界面被鎖定以防止不必要的點擊,並且我想知道我的所有文件夾何時完成搜索才能解鎖。 但我的問題是因爲我搜索幾個文件夾事件AllFilesProcessedEventHandler()
發射了好幾次,我想知道什麼時候我所有的搜索結束。
你使用哪個版本的.NET? 4.5或更低版本? – 2014-09-10 15:54:52
我正在使用.NET 4.0 – user3637066 2014-09-10 15:55:31
是否有使用隊列的原因?爲什麼不將一個文件夾作爲參數傳遞給該函數,以便您可以避免鎖定?您可以這樣做嗎? – 2014-09-10 16:05:36