代表:在4层之间传递消息

时间:2013-11-23 11:46:49

标签: c# multithreading delegates

我之前使用过代理在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();
    }
}

我无法理解为什么它不起作用。我收到以下错误:

  1. 错误:'Task.MsgRedirect(Task.UsrMsgDelegate)'的最佳重载方法匹配有一些无效的参数
  2. 错误:参数1:无法从'TaskManager.UsrMsgDelegate'转换为'Task.UsrMsgDelegate'
  3. 对于出了什么问题有什么建议吗?

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

    感谢。

1 个答案:

答案 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);

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