Cross-Threads событий-делегатов с временным объектом

Я уже проверил несколько потоков, но я до сих пор не знаю, как решить эту проблему. Может быть, я думаю о том, чтобы начать неправильно, и у этих вещей есть лучший способ решить эту проблему. Я был бы очень признателен, если бы вы могли мне помочь или сказать мне, правильный ли мой подход или нет.

Это просто показ сообщений в главной форме. И мне нужно что-то, что должно называться регистрацией событий в цепочке.

У меня есть класс FormMain

public delegate void EventErrorMessageBoxHandler(string ex);
public delegate void EventInfoMessageBoxHandler(string msg, string caption);

public partial class FormMain : Form
{
    public CommApp commApp;

    public FormMain()
    {
        InitializeComponent();
    }

    /// <summary>
    /// MESSAGE BOX EVENT FUNCTIONS
    /// </summary>
    public void MsgBoxShowError(string ex)
    {
        using (new CenterWinDialog(this))
        {
            Invoke(new MethodInvoker(delegate { MessageBox.Show(ex, GlobalStrings.Error, MessageBoxButtons.OK, MessageBoxIcon.Error); }));
        }
    }

    public void MsgBoxShowInfo(string msg, string caption)
    {
        using (new CenterWinDialog(this))
        {
            Invoke(new MethodInvoker(delegate { MessageBox.Show(msg, caption, MessageBoxButtons.OK, MessageBoxIcon.Information); }));
        }
    }

    private void MainForm_Shown(object sender, EventArgs e)
    {
           commApp = new CommApp();
           commApp.StartThreads();
    }
}

Так что в целом я хочу иметь возможность показывать окно сообщения об ошибке от каждого класса или потока по всей программе.

Чем я

public class CommApp 
{
    Thread applicationThread;
    public void StartThreads()
    {
            applicationThread = new Thread(new ThreadStart(AutomaticLoop));
            applicationThread.Start();
    }

    private void AutomaticLoop()
    {
        while (true)
        {
              using (MSSQL_Synchronization syncFnct = new MSSQL_Synchronization())
              {
                    // HERE IS PROBLEM I NEED TO LINK EVENT IN CLASS MSSQL_Synchronization TO FUNCTION IN MAIN FORM, I dont have visibility for that, should I pass reference each time to main form. Or should I to do something like chained events structure. Here should I write something like
                    syncFnct.MsgBoxShowError += new EventErrorMessageBoxHandler(FormMain.MsgBoxShowError);
                    syncFnct.SynchronizationColumns(tables);
              }
         }
    }
}

И последний класс, который генерирует событие

public class MSSQL_Synchronization
{
    public event EventErrorMessageBoxHandler MsgBoxShowError;
    public event EventInfoMessageBoxHandler MsgBoxShowInfo;

    protected virtual void OnShowError(string msg)
    {
        MsgBoxShowError?.Invoke(msg);
    }

    protected virtual void OnShowInfo(string msg, string caption)
    {
        MsgBoxShowInfo?.Invoke(msg,caption);
    }

    public MSSQL_Synchronization()
    {
        // CODE
        if (error) OnShowError("ERROR");
    }
}

Так что в моем случае основная проблема заключается в том, что я генерирую событие для временного объекта, и мне нужно как-то подключить его к EventHandler в FormMain. Я действительно не уверен, правильно ли я думаю об этой проблеме.

Большое спасибо за ответ.

BR

0 ответов

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