使用Task.Delay()的循环是否会造成内存泄漏?

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)

Ste*_*ary 6

我正在实现一个异步缓冲系统......

我强烈建议你使用现有的.TPL Dataflow是我的最佳推荐.但是,如果您的平台上没有这个,那么我AsyncProducerConsumerQueue的选择.

此设置允许您的消费者只使用ReceiveAsync/ DequeueAsync而不Task.Delay需要.

也就是说,我不相信会有像你描述的那样的内存泄漏.不过,我实际上并没有在分析器中运行它来验证这一点.

  • 好; 我不知道批处理要求.在这种情况下,您几乎肯定想要使用Reactive Extensions.它们具有内置操作,可以根据时间间隔进行批处理. (2认同)