gpt4 book ai didi

c# - 如何在执行枚举时管理不断变化的列表?

转载 作者:太空狗 更新时间:2023-10-30 01:23:55 24 4
gpt4 key购买 nike

我有一个对象(音符)列表,在播放时在单独的线程上枚举。我这样做是为了让 UI 线程保持响应。

当一个音符正在播放(作为枚举的一部分)时,我如何允许一个新的音符被添加到列表中(没有明显的集合修改异常)。

我知道我可以将列表复制到一个临时列表并枚举它,但我实际上希望列表随着用户选择的增加而增长(这将在播放第一个音符等时发生)。

伪逻辑:

onClick()
{
Queue.Add(theClickedNote)
Queue.Play() <-- on another thread
}

Play()
{
if(Playing==true){return ;}

foreach(note theNote in Queue)
{
Note.Play();
Queue.Remove(theNote);
}
}

正如您在上面看到的,每个 Click 事件都会将一个音符添加到队列中,然后调用队列中的播放方法。

队列枚举音符并在删除音符之前依次播放每个音符

我希望我已经清楚地解释了我想做的事情吗?

最佳答案

这样的东西可以与 ConcurrentQueue<T> 一起使用在 .Net 4 中。

ConcurrentQueue<Note> Queue = new ConcurrentQueue<Note>();

void onClick()
{
Queue.Enqueue(theClickedNote);

// start Play on another thread if necessary
}

void Play()
{
if (Playing) return;

Note note;
while(Queue.TryDequeue(out note))
{
note.Play();
}
}

ConcurrentQueue 是线程安全的,因此不需要实现锁定。

关于c# - 如何在执行枚举时管理不断变化的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10872812/

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