Я использую делегаты и события для передачи данных в своем приложении, но хочу, чтобы срабатывание 1 события передавало разные наборы данных в разные места.
Проблема
У меня есть основной класс, который выполняет некоторую работу. После завершения работы я хочу, чтобы он уведомил ряд других классов (включая пользовательский интерфейс), чтобы можно было выполнить другие действия. Информация, которая нужна другим классам, отличается.
Пример
Main.cs — выполняет действие и хочет обновить пользовательский интерфейс, отправить текстовое сообщение и записать в файл журнала.
Пользовательский интерфейс обновляет DataGrid, поэтому ему нужны отдельные поля.
Для записи файла журнала нужна вся строка целиком в виде массива/списка.
Для кода текстового сообщения требуются Line, LineNumber и FileName, но в виде строки с разделителями табуляции.
Ниже все работает правильно, когда я только пытаюсь обновить пользовательский интерфейс, но когда я пытаюсь отправить различную информацию в разные места, я сталкиваюсь с ошибками.
Я пробовал создавать разные расширения EventArgs, но если я попытаюсь объявить двух делегатов с разными подписями, я получу сообщение об ошибке.
Любая помощь приветствуется.
FrmMain.cs
Main main = new Main();
main.PatternFound += OnPatternFound;
main.DoSomeWork();
private void OnPatternFound(object source, LineEventArgs e)
{
UpdateDataGrid(e.Line, e.FileName, e.LineNumber);
}
private void UpdateDataGrid(string line, string file, int lineNumber)
{
if (InvokeRequired)
{
Invoke(new Action<string, string, int>(UpdateDataGrid), line, file, lineNumber);
}
else
{
dgResults.Rows.Add(line, file, lineNumber);
}
}
Main.cs
public delegate void PatternFoundEventHandler(object sender, LineEventArgs e);
public event PatternFoundEventHandler PatternFound;
protected virtual void OnPatternFound(string line, string fileName, int lineNumber)
{
PatternFound?.Invoke(this, new LineEventArgs { Line = line, FileName = fileName, LineNumber = lineNumber });
}
public void DoSomeWork()
{
//Finished my work
OnPatternFound(line, file, lineNumber);
}
LineEventArgs.cs
public class LineEventArgs : EventArgs
{
public string Line { get; set; }
public string FileName { get; set; }
public int LineNumber { get; set; }
}
EventArgs
, чтобы удовлетворить большинство потребностей. Или просто добавьте несколько событий. Лично мне нравится другой подход, гдеsender
используется как способ доступа ко всем как к членам экземпляра (EventArgs
не используется). Однако будьте осторожны с многопоточностью. - person Sinatr   schedule 09.10.2017InvokeRequired
говорит, что у вас может быть многопоточность. Для доступа к общедоступным членам может потребоваться какой-либо шаблон приобретения. Например. что-то плохое может произойти, если вы прочитаете публичное свойство со значением previous события. Вот гдеEventArgs
безопасны, как только экземпляр будет создан, он будет сохраняться (как правило, неизменным) для всех обработчиков событий для данного события. Следующее событие - новоеEventArgs
. - person Sinatr   schedule 09.10.2017