我有一个服务,确保同时显示一个弹出窗口.AddPopupAsync
可以同时调用,即弹出窗口打开而另外10个AddPopupAsync
请求丢失.代码:
public async Task<int> AddPopupAsync(Message message)
{
//[...]
while (popupQueue.Count != 0)
{
await popupQueue.Peek();
}
return await Popup(interaction);
}
Run Code Online (Sandbox Code Playgroud)
但是由于缺乏线程安全性,我可以发现可能发生的两件不需要的事情:
Popup方法与a一起使用TaskCompletionSource
,在调用其SetResult
方法之前,调用它popupQueue.Dequeue()
.
我考虑使用原子弹TryPeek
从ConcurrentQueue
为了使#1线程安全的:
do
{
Task<int> result;
bool success = popupQueue.TryPeek(out result);
if (!success) break;
await result;
}
while (true);
Run Code Online (Sandbox Code Playgroud)
然后我读到了AsyncProducerConsumerCollection,但我不确定这是否是最简单的解决方案.
如何以简单的方式确保线程安全?谢谢.