Отправить данные обратно из класса вызывающему - PullRequest
0 голосов
/ 05 апреля 2011

Я ищу способ передачи данных из класса обратно родителю, однако это не так просто, как кажется (например, доступ к переменной класса).

У меня есть этот звонок в моей заявке:

protected override void OnStart(string[] args)
{
    eventLog1.WriteEntry("Start");

    // set up touchpad monitor
    cm = new COMManager("COM3",eventLog1);

}

И COMManager выглядит следующим образом:

class COMManager
{

    static SerialPort _serialPort;
    EventLog eventlogger;

    public COMManager(string portname,EventLog eventlogger)
    {
        this.eventlogger = eventlogger;
        this.eventlogger.WriteEntry("started com porter");

        StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
        //Thread readThread = new Thread(Read);

        // Create a new SerialPort object with default settings.
        _serialPort = new SerialPort();

        // Allow the user to set the appropriate properties.
        _serialPort.PortName = portname;
        _serialPort.BaudRate = 9600;
        _serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), "0");
        _serialPort.DataBits = 8;
        _serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits),"1");


        // Set the read/write timeouts
        _serialPort.ReadTimeout = 500;
        _serialPort.WriteTimeout = 500;

        _serialPort.Open();
        _serialPort.DataReceived += serialPort_DataReceived;

    }

    void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e)
    {
        this.eventlogger.WriteEntry(Convert.ToChar(_serialPort.ReadChar()).ToString());
    }

}

В serialPort_DataReceived регистратор событий работает нормально, однако я хочу иметь возможность передавать это обратно в основной поток при получении любых данных, поскольку мне нужно выполнить некоторые изменения в графическом интерфейсе.

Любые идеи о том, с чего начать, были бы великолепны.

1 Ответ

2 голосов
/ 05 апреля 2011

Один из способов - создать событие в вашем классе COMManager. Метод serialPort_DataReceived вызовет это событие при получении данных. Владелец экземпляра COMManager может подписаться на событие.

Возможно, вы захотите определить DataReceivedEventArgs:

public class DataReceivedEventArgs: EventArgs
{
    // whatever you need here
}

И вам понадобится делегат:

public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);

А затем вы создаете событие:

// Inside COMManager
public event DataReceivedEventHandler DataReceived;

void serialPort_DataReceived(...)
{
    // do whatever
    if (DataReceived != null)
    {
        DataReceived(this, eventArgs);
    }
}

Абонент подписывается на событие так же, как вы подписываетесь на другие события:

protected override void OnStart(string[] args)
{
    eventLog1.WriteEntry("Start");

    // set up touchpad monitor
    cm = new COMManager("COM3",eventLog1);

    // subscribe to the event.
    cm.DataReceived += this.DataReceived;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...