gpt4 book ai didi

c# - 如何在后台异步从流中读取数据

转载 作者:行者123 更新时间:2023-11-30 16:53:37 25 4
gpt4 key购买 nike

我想从流(串行、tcp 等)中异步读取数据并触发事件以通知其他组件。

以下是伪代码,假设“stream”是一个有效的流。

public class Reader {

private _stream;
private _buffer = new bytes[4096];

public event Action<byte[], int> DataRecieved;

public async void StartReading() {
while (true) {
var nbytes = await _stream.ReadAsync(_buffer, 0, _buffer.Length);
if (nbytes == 0)
return;
var handlers = DataRecieved;
if (handlers != null)
DataRecieved(_buffer, nbytes);
}
}

}

调用者部分:

var r = new Reader();
r.OnDataRecieved += myHandler;
r.StartReading();

我不确定这样做是不是个好主意。我读到使用异步 void 函数不是一个好主意,但在这里我不希望调用者等待结果,我想在某些数据可用时通知它。

做这样的事情的好方法是什么?

最佳答案

void async 仅被视为用于 GUI 事件处理程序。在 WinForms 中,事件的所有委托(delegate)类型都是 void 类型。通常,您希望在使用 async 时,以异步方式在完成时通知您的调用者。 .NET 消息循环在这里被认为是异常(exception),因为您没有不同的可能性来使用 async

在您的情况下,async/await 关键字没有多大意义。我建议使用 Task 调用您的方法或 ThreadPool (或 BackgroundWorker )。

您没有想要以异步方式对其使用react的长时间运行的任务,而是并行后台任务,应该这样使用。

async/await 的思想是方法的调用者在方法调用之后继续,并且可以稍后在 await 后面执行方法内的代码。但这需要您在调用方法中使用 await,这会阻塞您的主线程。

长话短说:您没有其他机会使用第二个线程并使用线程同步。

Invoke 就是将 delegate 放入消息循环读取和执行的队列中。在您的情况下,您可以做类似的事情:获取读取的数据,例如 byte[] 并将其放入队列中(通过事件)。每当你的主线程想要做一些工作时,他就会从队列中抓取一个项目。这是一种选择。此问题的最佳解决方案在很大程度上取决于您的应用程序,并且就您没有告诉我们有关设计的更多详细信息而言,我不能推荐最佳方法。但是 async/await 不会。确实。

关于c# - 如何在后台异步从流中读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31267835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com