代表:在4层之间传递消息
我以前使用委托在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。
谢谢。
回答:
你的MsgRedirect
声明如下所示:
public void MsgRedirect(UsrMsgDelegate msgHandler)
,但你这样调用它:
tm.MsgRedirect(this.UsrMsg);
其中this.UsrMsg
出现是与此配置文件的方法:
private void UsrMsg(string Msg)
This将是第一个错误的原因。
您也声明了委托:
public delegate void UsrMsgDelegate(string msg);
三个每个类APIWrapper
,Task
和TaskManager
的时间一次。这也可能是编译器混淆的原因 - 因此第二个错误。
以上是 代表:在4层之间传递消息 的全部内容, 来源链接: utcz.com/qa/264527.html