Недопустимая операция в нескольких потоках - C# (216595)
Формулировка задачи:
Че-то в соседнем разделе никто не откликнулся, так что спрошу здесь.
Что-то непонятное происходит - пишу прогу с использованием FileSystemWatcher, при срабатывании любого его события выскакивает ошибка "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "listBox1" не из того потока, в котором он был создан."
на строке кода
на строке кода
Хотя прогу многопоточную не пишу. Что посоветуете сделать? Вот полный текст кода:
listBox1.Items.Add(dt.ToLocalTime() + " " + rea.ChangeType.ToString() + rea.OldFullPath + "to " + " " + rea.FullPath);
public partial class Form1 : Form
{
[DllImport("user32.dll")]
public static
extern bool
MessageBeep(int
Sound);
FileSystemWatcher watcher = new FileSystemWatcher();
public Form1()
{
InitializeComponent();
textBox1.Text = "D:\\";
textBox2.Text="*.*";
}
private void button2_Click(object sender, EventArgs e)
{
watcher.EnableRaisingEvents = false;
}
private void button1_Click(object sender, EventArgs e)
{
//if (watcher.EnableRaisingEvents == true)
//{
// MessageBeep(100);
// return;
//}
listBox1.Items.Clear();
watcher.Path = textBox1.Text;
watcher.Filter = textBox2.Text;
watcher.NotifyFilter = NotifyFilters.FileName |
NotifyFilters.Attributes |
NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.Security |
NotifyFilters.Size;
if (checkBox2.Checked == true)
watcher.Changed += new FileSystemEventHandler(OnFileEvent);
else watcher.Changed -= new
FileSystemEventHandler(OnFileEvent);
if (checkBox4.Checked == true)
watcher.Created += new
FileSystemEventHandler(OnFileEvent);
else watcher.Created -= new
FileSystemEventHandler(OnFileEvent);
if (checkBox5.Checked == true)
watcher.Deleted += new FileSystemEventHandler(OnFileEvent);
else watcher.Deleted -= new
FileSystemEventHandler(OnFileEvent);
if (checkBox3.Checked == true)
watcher.Renamed += new RenamedEventHandler(OnRenameEvent);
else watcher.Renamed -= new RenamedEventHandler(OnRenameEvent);
if (checkBox1.Checked == true)
watcher.IncludeSubdirectories = true;
else watcher.IncludeSubdirectories = false;
watcher.EnableRaisingEvents = true;
}
public void OnFileEvent(object source, FileSystemEventArgs fsea)
{
DateTime dt = new DateTime();
dt = System.DateTime.UtcNow;
listBox1.Items.Add(dt.ToLocalTime() + " " +fsea.ChangeType.ToString() + " " + fsea.FullPath);
MessageBox.Show("Event");
}
public void OnRenameEvent(Object source, RenamedEventArgs rea)
{
DateTime dt = new DateTime();
dt = System.DateTime.UtcNow;
listBox1.Items.Add(dt.ToLocalTime() + " " + rea.ChangeType.ToString() + rea.OldFullPath + "to " + " " + rea.FullPath);
MessageBox.Show("Rename");
}
private void button3_Click(object sender, EventArgs e)
{
Application.Exit();
}
}Решение задачи: «Недопустимая операция в нескольких потоках»
textual
Листинг программы
public void f1()
{
if (listBox1.InvokeRequired)
{
MethodInvoker mi = delegate
{
f1();
};
listBox1.Invoke(mi);
}
else
{
listBox1.Items.Add(dt.ToLocalTime() + " " + rea.ChangeType.ToString() + rea.OldFullPath + "to " + " " + rea.FullPath);
}
}