2013-11-23 28 views
0

我以前使用委托在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(); 
    } 
} 

我不明白为什么它不工作。我收到以下错误:

  1. 错误:最好的重载方法匹配“Task.MsgRedirect(Task.UsrMsgDelegate)”有一些无效参数
  2. 错误:参数1:无法从“TaskManager.UsrMsgDelegate”转换到'Task.UsrMsgDelegate'

有什么问题有什么建议吗?

另外,从设计的角度来看,从Base传递消息到Task,然后将Task中的Base和Task消息传递给TaskManager会更好吗?或者更好地做我现在正在做的事情,这是从Task传递消息到TaskManager,并从Base传递给TaskManager。

谢谢。

回答

1

你的MsgRedirect声明如下所示:

public void MsgRedirect(UsrMsgDelegate msgHandler) 

,但你这样调用它:

tm.MsgRedirect(this.UsrMsg); 

其中this.UsrMsg出现是与此配置文件的方法:

private void UsrMsg(string Msg) 

This将是第一个错误的原因。

您也声明了委托:

public delegate void UsrMsgDelegate(string msg); 

三个每个类APIWrapperTaskTaskManager的时间一次。这也可能是编译器混淆的原因 - 因此第二个错误。

相关问题