В этом случае я использую этот метод 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.
}
}
Как это исправить?
Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/790 ... riggered-o
Мобильная версия