2011-04-04 77 views
0

我正在尋找一種方法來將數據從一個類傳遞迴父類,但是,它並不像聽起來那麼簡單(例如,訪問類變量)。發送數據返回給調用者

我有這個調用我的應用程序:

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,事件記錄器工作正常,但是,我希望能夠到在接收到任何數據時將其傳遞迴主線程,因爲我需要對GUI進行一些修改。

任何關於從哪裏開始的想法都會很棒。

回答

2

一種方法是在COMManager課程中創建一個活動。每當收到數據時,serialPort_DataReceived方法都會引發該事件。 COMManager實例的所有者可以訂閱該事件。

你可能要定義一個​​:

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; 
} 
相關問題