Я ранее использовал делегатов для разговора между двумя слоями, мой базовый уровень отправил сообщения до моего уровня графического интерфейса. С тех пор я добавил еще два слоя между ними, и 4 слоям сложно «разговаривать друг с другом». Класс задачи запускается в своем потоке.Делегаты: передача сообщений между 4-мя слоями
Базовый слой (формирует сообщения и передает их вверх):
public class APIWrapper
{
public delegate void UsrMsgDelegate(string msg);
private UsrMsgDelegate UsrMsg;
public void MsgRedirect(UsrMsgDelegate msgHandler)
{
UsrMsg = msgHandler;
}
// Send a message with UsrMsg("message");
}
Task (где почти вся логика делается), генерирует сообщения и передает их.
public class Task
{
public delegate void UsrMsgDelegate(string msg);
APIWrapper base;
public Task(APIWrapper apiWrapper)
{
base = apiWrapper;
}
private UsrMsgDelegate UsrMsg;
public void MsgRedirect(UsrMsgDelegate msgHandler)
{
UsrMsg = msgHandler;
}
// Send a message with UsrMsg("message");
}
TaskManager (Я планирую добавить дополнительные задачи (это все будет управлять ими)). Это просто передает сообщения до GUI
public class TaskManager
{
public delegate void UsrMsgDelegate(string msg);
APIWrapper base;
Task task;
public Task()
{
base = new APIWrapper();
base.MsgRedirect(this.UsrMsg);
task = new Task(base);
task.MsgRedirect(this.UsrMsg);
}
private UsrMsgDelegate UsrMsg;
public void MsgRedirect(UsrMsgDelegate msgHandler)
{
UsrMsg = msgHandler;
}
}
GUI (передаются здесь все сообщения)
public partial class Form1 : Form
{
TaskManager tm;
public Form1()
{
tm = new TaskManager();
tm.MsgRedirect(this.UsrMsg);
}
public delegate void dlgUsrMsg(string Msg);
private void UsrMsg(string Msg)
{
if (InvokeRequired)
{
BeginInvoke(new dlgUsrMsg(UsrMsg), Msg);
return;
}
Debug.WriteLine(Msg);
if (logBox.Text.Length > 20000)
{
logBox.Text.Remove(0, 5000);
}
logBox.Text += Msg + "\r\n";
logBox.Select(logBox.Text.Length, 0);
logBox.ScrollToCaret();
}
}
Я не могу понять, почему это не работает. Я получаю следующие ошибки:
- Ошибка: Лучший перегружен матч метод «Task.MsgRedirect (Task.UsrMsgDelegate)» имеет некоторые недопустимые аргументы
- Ошибка: Аргумент 1: не удается преобразовать из «TaskManager.UsrMsgDelegate» to 'Task.UsrMsgDelegate'
Есть ли какие-либо предложения о том, что происходит не так?
Кроме того, было бы лучше с точки зрения дизайна передавать сообщения от базы к задаче, а затем передавать сообщения Base и Task из Task до TaskManager? Или лучше делать то, что я сейчас делаю, передавая сообщения от Task to TaskManager и от Base to TaskManager.
Спасибо.