У меня есть этот код
private delegate void InvokeDelegate();
private void OpenFormNewNote(object sender, FileSystemEventArgs e)
{
if (loop == 2)
{
string service = null;
if (currentServiceName != null)
{
service = currentServiceName.Replace(" ", "");
}
NewNotePanel newNote = new NewNotePanel(e.FullPath, service, listOfService, Path, MyConn, ipAddress, imgFolder, Utente_id);
newNote.TopMost = true;
watcher.EnableRaisingEvents = false;
var result = newNote.ShowDialog();
if (result == DialogResult.OK || result == DialogResult.Cancel)
{
watcher.EnableRaisingEvents = true;
if (result == DialogResult.OK)
{
this.BeginInvoke(new InvokeDelegate(Refresh));
}
}
loop = 0;
}
else
{
loop++;
}
}
А это функция Refresh ():
public void Refresh()
{
noteContainer.Controls.Clear();
page = 0;
try
{
string Query = "SELECT a, v, b, cFROM note Where Servizio_ID = " + asd+ " AND Visibile = 1 order by ID desc limit 15 OFFSET " + (pageIndex * page) + " ;";
MySqlCommand MyCommand = new MySqlCommand(Query, MyConn);
MySqlDataReader MyReader;
if (MyConn.State == ConnectionState.Open)
{
MyReader = MyCommand.ExecuteReader();// Here our query will be executed and data saved into the database.
while (MyReader.Read())
{
CreateNotePreview(MyReader.GetString("a"), MyReader.GetString("b"), MyReader.GetString("c"), MyReader.GetString("d"));
}
MyReader.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Поскольку OpenFormNewNote вызывается, когда запускается событие «Изменить» FileSystemWatcher ... конечно, он выполняется в отдельном потоке. Вместо этого Refresh () выполняет некоторые функции пользовательского интерфейса, и его нельзя вызвать напрямую из OpenFormNewNote (), иначе он выдаст исключение Cross-Thread. Итак, я попробовал с делегатом, но когда поток кода доходит до части BeginInvoke ... Ничего не происходит, и функция Refresh не вызывается.
Что мне делать?
BeginInvoke работает просто хорошо; если вы поставите точку останова в начале Refresh, попадется ли она?
@MarcGravell не попал ..
@HansPassant Не могли бы вы написать и ответить в поле SynchronizingObject, которое решило мою проблему .. Я могу проверить ваш ответ как правильный .. спасибо





Код содержит ошибки, и вы можете легко выстрелить в левую ногу. Использование ShowDialog () в рабочем потоке - очень плохая идея с возможными фатальными последствиями позже. Выполнение запросов к базе данных в потоке пользовательского интерфейса - плохая идея. Использование Controls.Clear () неприятно, жесткое требование - вызывать Dispose () для элементов управления, от которых вы хотите избавиться. Подумайте о том, чтобы продвинуться вперед, установив FileSystemWatcher.SynchronizingObject в свою основную форму, теперь вы получаете событие, возникающее в вашем потоке пользовательского интерфейса. Дает вам лучший шанс правильно разбить код. Отладка тупиковой ситуации с помощью Debug> Windows> Threads.