小编use*_*276的帖子

如何使用队列线程安全的异步方法

我有一个服务,确保同时显示一个弹出窗口.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)

但是由于缺乏线程安全性,我可以发现可能发生的两件不需要的事情:

  1. 如果队列为空,Peek将抛出异常
  2. 如果线程A在Popup中的第一个语句之前被抢占,则另一个线程B将不会等待挂起的弹出A,因为队列仍然是空的.

Popup方法与a一起使用TaskCompletionSource,在调用其SetResult方法之前,调用它popupQueue.Dequeue().

我考虑使用原子弹TryPeekConcurrentQueue为了使#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,但我不确定这是否是最简单的解决方案.

如何以简单的方式确保线程安全?谢谢.

.net c# thread-safety async-await

5
推荐指数
1
解决办法
2012
查看次数

标签 统计

.net ×1

async-await ×1

c# ×1

thread-safety ×1