开发者

Send data back from class to caller

开发者 https://www.devze.com 2023-02-22 04:41 出处:网络
I\'m looking for a way to pass data from a class back to the parent, however, it\'s not as simple as it sounds (e.g. accessing a class variable).

I'm looking for a way to pass data from a class back to the parent, however, it's not as simple as it sounds (e.g. accessing a class variable).

I have this call in my application:

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

    // set up touchpad monitor
    cm = new COMManager开发者_如何学C("COM3",eventLog1);

}

And the COMManager looks as follows:

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());
    }

}

In serialPort_DataReceived, the event logger works fine, however, I want to be able to pass this back to the main thread when any data is received as I need to do some GUI modifications.

Any ideas on where to start would be great.


One way would be to create an event in your COMManager class. The serialPort_DataReceived method would raise that event whenever data is received. The owner of the COMManager instance can subscribe to the event.

You'll probably want to define a DataReceivedEventArgs:

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

And you'll need a delegate:

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

And then you create the event:

// Inside COMManager
public event DataReceivedEventHandler DataReceived;

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

The caller subscribes to the event the same way that you subscribe to other events:

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;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号