Cha*_*ion 2 c# task async-await
我正在实现一个异步缓冲系统,我想要一个队列的一个消费者,以保证项目按顺序进行.消费者应定期检查队列,处理其中的所有项目,然后"休眠"一段时间.Task.Delay()似乎非常适合这样的系统,因为与Thread.Sleep()不同,它在休眠时不会消耗线程,而且与Timer不同,如果处理队列项需要的时间超过休眠间隔,它将不会启动新线程.但是,我想知道如果任务系统正在跟踪原始任务的整个继续列表,在while循环中使用Task.Delay()是否会创建内存泄漏.作为参考,我的系统看起来像:
void EnqueueItem(Item item) {
lock (this._lock) { this._items.Add(item); }
}
async Task Consumer() {
while (true) {
await Task.Delay(interval).ConfigureAwait(false);
Item[] items = null;
lock (this._lock) {
if (this._disposed) { return; }
if (this._items.Count > 0)
{
items = this._items.ToArray();
this._items.Clear();
}
}
if (items != null) { Process(items); }
}
}
// in the constructor of the buffer
this.Consumer();
Run Code Online (Sandbox Code Playgroud)
我正在实现一个异步缓冲系统......
我强烈建议你使用现有的.TPL Dataflow是我的最佳推荐.但是,如果您的平台上没有这个,那么我AsyncProducerConsumerQueue的选择.
此设置允许您的消费者只使用ReceiveAsync/ DequeueAsync而不Task.Delay需要.
也就是说,我不相信会有像你描述的那样的内存泄漏.不过,我实际上并没有在分析器中运行它来验证这一点.