我們是否已經在.NET 4.0中有機會等待響應,然後返回響應?SerialPort等待響應
目前我正在做這樣的,但它是不是真的很好,我不喜歡它:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
byte[] options = new byte[]{1,1,0};
COMManager mgr = new COMManager("COM1");
byte[] result = mgr.GetResponse(options);
}
}
我的COM Manager類 (我必須做在一個單獨的操作(dll)):
public class COMManager
{
SerialPort sp = null;
byte[] result = null;
bool completed = false;
public COMManager(string comport)
{
sp = new SerialPort(comport);
sp.DataReceived +=new SerialDataReceivedEventHandler(sp_DataReceived);
}
public byte[] GetResponse(byte[] option)
{
sp.Write(option, 0, option.Length);
//I don't like the way...
while (!completed) { }
completed = false;
return result;
}
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
result = new byte[sp.BytesToRead];
sp.Read(result, 0, sp.BytesToRead);
completed = true;
}
}
在.NET 4.5中,我們可能有機會使用「await」語句。但是對於當前的項目,我們只允許使用.NET 4.0。 任何想法?
嗨阿斯蒂。感謝您的回覆。我以前從未使用過ManualResetEvents。所以我添加「私人靜態ManualResetEvent mre =新的ManualResetEvent(false);」到我的COMManager類和「mre.Reset()」將取代我的while循環。並在dp_DataReceived而不是完成= true我設置mre.Set()正確? – user1011394 2012-08-02 16:55:13
@ user1011394是的,基本上。不要聲明它是靜態的。 – Asti 2012-08-02 17:08:29
您也可以使用AutoResetEvent,它在設置後會自動重置,所以如果您願意,您不必重設Reset。 – Asti 2012-08-02 17:10:32