我想要如此同步我的文件夾,所以我有10個Filesystemwatcher和4個Backgroundworkers。 想法是,一個觀察員可以打電話給4名工作人員,但我希望觀察員選擇一個主動和自由的工作人員,其他人不應該被觸發。c#filesystemwatcher和backgroundworker
經驗值:工人1被解僱,2-4沒有。
我在這裏做錯了什麼?
這裏是我的代碼
private void watcher1_OnChanged(object source, FileSystemEventArgs e)
{
// File Name
string file = e.FullPath;
// refresh App.Config
ConfigurationManager.RefreshSection("appSettings");
// Check Worker Active
bool worker1Active = Convert.ToBoolean(ConfigurationManager.AppSettings["worker1Active"]);
bool worker2Active = Convert.ToBoolean(ConfigurationManager.AppSettings["worker2Active"]);
bool worker3Active = Convert.ToBoolean(ConfigurationManager.AppSettings["worker3Active"]);
bool worker4Active = Convert.ToBoolean(ConfigurationManager.AppSettings["worker4Active"]);
// Watcher Nummer
string watcherNr = "Watcher 1";
// Arguments to call worker
List<object> arguments = new List<object>();
arguments.Add(file);
arguments.Add(watcher1_destinationPath);
arguments.Add(watcher1_sourcePath);
arguments.Add(watcherNr);
bool success = false;
while (!success == true)
{
try
{
using (Stream stream = new FileStream(file, FileMode.Open))
{
if (worker1Active == true && worker1.IsBusy != true)
{
worker1.RunWorkerAsync(arguments);
success = true;
break;
}
if (worker2Active == true && worker2.IsBusy != true)
{
worker2.RunWorkerAsync(arguments);
success = true;
break;
}
if (worker3Active == true && worker3.IsBusy != true)
{
worker3.RunWorkerAsync(arguments);
success = true;
break;
}
if (worker4Active == true && worker4.IsBusy != true)
{
worker4.RunWorkerAsync(arguments);
success = true;
break;
}
}
}
catch
{
success = false;
}
}
}
你爲什麼不使用線程池掛鉤的創建,重命名,修改和刪除事件相同的事件處理程序(FileWatcher_Changed)? –
阿曼說。這不是線程安全的。如果所有的工作人員都忙着工作堆積如何,你會怎麼做?您應該使用隊列排隊工作和線程池來完成工作。您讓文件系統監視器爲您排隊工作,並且可以將線程池設置爲許多工作人員在後臺執行工作。如果你想我可以做一個小例子的應用程序,並在這裏發佈代碼。 –
線程的真正原因是您希望儘量減少事件回調中的工作量,否則您將面臨丟失文件系統更改的風險 – MickyD