У вас есть синхронизация с конфликтом пользовательского интерфейса основного потока.
Вы должны синхронизировать вызов с любым действием элементов управления пользовательского интерфейса с основным потоком.
Вы можете использовать BackgroundWorker.
Или это:
static public class SyncUIHelper
{
static public Thread MainThread { get; private set; }
// Must be called from the Program.Main or the Main Form constructor for example
static public void Initialize()
{
MainThread = Thread.CurrentThread;
}
static public void SyncUI(this Control control, Action action, bool wait = true)
{
if ( !Thread.CurrentThread.IsAlive ) throw new ThreadStateException();
Exception exception = null;
Semaphore semaphore = null;
Action processAction = () =>
{
try { action(); }
catch ( Exception except ) { exception = except; }
};
Action processActionWait = () =>
{
processAction();
if ( semaphore != null ) semaphore.Release();
};
if ( control != null
&& control.InvokeRequired
&& Thread.CurrentThread != MainThread )
{
if ( wait ) semaphore = new Semaphore(0, 1);
control.BeginInvoke(wait ? processActionWait : processAction);
if ( semaphore != null ) semaphore.WaitOne();
}
else
processAction();
if ( exception != null ) throw exception;
}
}
Использование:
this.SyncUI(listForms[i].Close /*, true or false to wait or not */);
А:
this.SyncUI(() => form.ShowDialog() /*, true or false to wait or not */);
С:
private void Form1_Load(object sender, EventArgs e)
{
SyncUIHelper.Initialize();
RunFileSystemWatcher();
}
Вынеобходимо исправить ваш код в FileSystemWatcher_Changed, потому что он глючит.