Проблемы с классом регистрации сообщений. Класс не обрабатывает событие при запуске за пределами основной формы.C#

Место общения программистов C#
Ответить
Anonymous
 Проблемы с классом регистрации сообщений. Класс не обрабатывает событие при запуске за пределами основной формы.

Сообщение Anonymous »

Я создал класс Logging, в котором событие Logging.Send() запускает событие, которое доставляет строковое сообщение всем подписанным классам.
В этом случае я использую этот метод Logging.Send(string message, ELogType type); который запускает журналы событий , которые затем прослушиваются моей основной формой code>, который добавляет сообщение в RichTextBox, который действует как мой текстовый журнал в зависимости от типа сообщения.
Моя основная проблема заключается в том, что этот метод Logging.Send отправляет только свои сообщение в журнал при вызове в моем основном классе формы. Если я вызову его в другом классе, для примера назовем его Controller, оно вызовет событие, но форма подписки, похоже, его не получит. Что сделал не так?
Вот пример моей проблемы:

Код: Выделить всё

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

public enum ELogType { Primary, Simple, Extra, Readout, Debug }

public class Logging
{

public Logging() { }

public event EventHandler Log;

public bool PostPrimaryLogs = true,
PostSimpleLogs = true,
PostExtraLogs = false,
PostReadoutLogs = false,
PostDebugLogs = false;

public void Send(string message)
{
Send(message, ELogType.Primary);
}

public void Send(string primaryMessage, string simpleMessage)
{
Send(new[] { primaryMessage, simpleMessage }, new[] { ELogType.Primary, ELogType.Simple });
}

public void Send(string message, ELogType type)
{
Console.WriteLine("sendtest"); //to check that the send event was happening.
if ((type == ELogType.Primary && PostPrimaryLogs == true) //is there some way to avoid this giant if statement here?
|| (type == ELogType.Simple && PostSimpleLogs == true)
|| (type == ELogType.Extra && PostExtraLogs == true)
|| (type == ELogType.Readout && PostReadoutLogs == true)
|| (type == ELogType.Debug && PostDebugLogs == true))
Log?.Invoke(this, new LoggerMessageArgs(message, type));
}

public void Send(string[] messages, ELogType[] types)
{
if (messages.Length == types.Length)

for (int i = 0; i < messages.Length; i++)
{
Send(messages[i], types[i]);
}
}
}

public class LoggerMessageArgs
{
public string Message { get; }

public ELogType LogType { get; }

public LoggerMessageArgs(string message)
{
Message = message;
LogType = ELogType.Primary;
}

public LoggerMessageArgs(string message, ELogType logType)
{
Message = message;
LogType = logType;
}
}

public class Controller
{
Logging Logger = new Logging();

public async Task DoControl()
{
Logger.Send("beginning doControl", ELogType.Primary);
await Task.Delay(1000); //do work
Logger.Send("finished doControl", ELogType.Primary);
return Task.CompletedTask;
}
}

public partial class Form1: Form
{
Logging Logger = new Logging();

//needs an additional RichTextBox LogTextBox, and a RichTextBox SimpleLogTextBox. The simple log box isn't super important to the issue at hand.  It's mostly used as a status indicator.

Form1()
{
InitializeComponent();
Logger.Log += (sender, e) =>
{
Action action = () =>
{
if (e.LogType == ELogType.Primary || e.LogType == ELogType.Debug || e.LogType == ELogType.Extra || e.LogType == ELogType.Readout)
{
LogTextBox.AppendText($@"{DateTime.Now:hh\:mm\:ss\.ffff}: {e.Message}{Environment.NewLine}");
LogTextBox.SelectionStart = LogTextBox.Text.Length;
LogTextBox.ScrollToCaret();
}
if (e.LogType == ELogType.Simple)
{
SimpleLogTextBox.AppendText($@"{e.Message}{Environment.NewLine}");
SimpleLogTextBox.SelectionStart = SimpleLogTextBox.Text.Length;
SimpleLogTextBox.ScrollToCaret();
}
};

if (LogTextBox.InvokeRequired)
{
LogTextBox.Invoke(action);
}

else
{
action();
}
};
}

private void TestButton_Click(object sender, EventArgs e)
{
Logger.Send(new string[] { "Form Primary Log Test", "Form Simple Log Test" }, new ELogType[] { ELogType.Primary, ELogType.Simple }); //logs come back from this one
Controller.DoControl() //no logs come back from this one.
}
}
С помощью этого кода я получаю строку «{datetime} Form Primary Test Log» в основном журнале, но полное радиомолчание от DoControl.
Как это исправить?
Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/790 ... riggered-o
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»