我以前使用委托在2层之间进行通信,我的基层会发送消息到我的GUI层。之后,我在它们之间又增加了2层,这使得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");
}
任务(其中几乎所有的逻辑的完成),生成消息并将它们。
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”转换到'Task.UsrMsgDelegate'
有什么问题有什么建议吗?
另外,从设计的角度来看,从Base传递消息到Task,然后将Task中的Base和Task消息传递给TaskManager会更好吗?或者更好地做我现在正在做的事情,这是从Task传递消息到TaskManager,并从Base传递给TaskManager。
谢谢。