use*_*413 5 c# serial-port async-await
我在这里阅读了一些建议与port.BaseStream.ReadAsync()waith async/await 一起使用的线程。我不清楚实施此操作的最佳方法是什么?
我是否仍然使用 event_handler 并将其设为异步/可等待?
private async void myPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] buffer = new byte[myPort.BytesToRead];
await (myPort.BaseStream.ReadAsync(buffer, 0, buffer.Length));
}
Run Code Online (Sandbox Code Playgroud)
或者事件处理程序是否完全被忽略,而是我在循环中调用 ReadAsync?
编辑:解析后,我将 1) 将数据发送到 TCP 服务器,2) 将其写入 sq3lite 数据库。
Microsoft 更新了 API,可以实现相对简单的异步读写实现。请注意,您不会实现您似乎已经完成的同步事件处理程序,而只需在您希望在 COM 端口上接收数据时调用此函数:
public async Task<Stream> ReceiveData()
{
var buffer = new byte[4096];
int readBytes = 0;
SerialPort port = new SerialPort(/* ... */);
using (MemoryStream memoryStream = new MemoryStream())
{
while ((readBytes = await port.BaseStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, readBytes);
}
return memoryStream;
}
}
Run Code Online (Sandbox Code Playgroud)
这是另一个替代实现(请参阅http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport),其中作者解释了 SerialPort DataReceived、BytesToRead和其他 API 成员的问题。他没有使用 SerialPort API,因为他指出该 API 的设计、实现和测试都很糟糕,他建议使用以下方法BaseStream:
Action kickoffRead = null;
kickoffRead = delegate {
port.BaseStream.BeginRead(buffer, 0, buffer.Length, delegate (IAsyncResult ar) {
try {
int actualLength = port.BaseStream.EndRead(ar);
byte[] received = new byte[actualLength];
Buffer.BlockCopy(buffer, 0, received, 0, actualLength);
raiseAppSerialDataEvent(received);
}
catch (IOException exc) {
handleAppSerialError(exc);
}
kickoffRead();
}, null);
};
kickoffRead();
Run Code Online (Sandbox Code Playgroud)
请注意,我发现使用 BCL 的性能改进BaseStream比使用 SerialPort API 好很多数量级。
| 归档时间: |
|
| 查看次数: |
8933 次 |
| 最近记录: |