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