C# BeginInvoke не работает

У меня есть этот код

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 не вызывается.

Что мне делать?

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

Hans Passant 16.03.2018 10:15
BeginInvoke работает просто хорошо; если вы поставите точку останова в начале Refresh, попадется ли она?
Marc Gravell 16.03.2018 10:18

@MarcGravell не попал ..

Alessio Trecani 16.03.2018 10:20

@HansPassant Не могли бы вы написать и ответить в поле SynchronizingObject, которое решило мою проблему .. Я могу проверить ваш ответ как правильный .. спасибо

Alessio Trecani 16.03.2018 10:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
85
0

Другие вопросы по теме