2013-11-23 13 views
0

Я ранее использовал делегатов для разговора между двумя слоями, мой базовый уровень отправил сообщения до моего уровня графического интерфейса. С тех пор я добавил еще два слоя между ними, и 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"); 
} 

Task (где почти вся логика делается), генерирует сообщения и передает их.

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» to 'Task.UsrMsgDelegate'

Есть ли какие-либо предложения о том, что происходит не так?

Кроме того, было бы лучше с точки зрения дизайна передавать сообщения от базы к задаче, а затем передавать сообщения Base и Task из Task до TaskManager? Или лучше делать то, что я сейчас делаю, передавая сообщения от Task to TaskManager и от Base to TaskManager.

Спасибо.

ответ

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. Это также может быть причиной путаницы для компилятора - отсюда вторая ошибка.

Смежные вопросы