我之前使用过代理在2层之间进行交谈,我的Base层会将消息发送到我的GUI层。我已经在它们之间添加了另外2层,并且证明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();
}
}
我无法理解为什么它不起作用。我收到以下错误:
对于出了什么问题有什么建议吗?
另外,从设计角度来看,将消息从Base传递给Task然后将Base和Task消息从Task传递到TaskManager会更好吗?或者更好地做我目前正在做的事情,即将消息从Task传递到TaskManager,从Base传递给TaskManager。
感谢。
答案 0 :(得分:1)
您对MsgRedirect
的声明如下:
public void MsgRedirect(UsrMsgDelegate msgHandler)
但你这样称呼它:
tm.MsgRedirect(this.UsrMsg);
this.UsrMsg
出现作为此个人资料的方法:
private void UsrMsg(string Msg)
这可能是第一次错误的原因。
您还宣布了您的代表:
public delegate void UsrMsgDelegate(string msg);
每个班级APIWrapper
,Task
和TaskManager
三次。这也可能是编译器混淆的原因 - 因此是第二个错误。