Aynı anda tam olarak bir açılır pencerenin görüntülenmesini sağlayan bir hizmetim var. . AddPopupAsync
kodu başka bir 10 AddPopupAsync
istekleri düşüş ise bir pop-up açıktır, yani aynı anda çağrılabilir:Kuyruk ipliği güvenliğini kullanan eşzamansız yöntemler nasıl yapılır
public async Task<int> AddPopupAsync(Message message)
{
//[...]
while (popupQueue.Count != 0)
{
await popupQueue.Peek();
}
return await Popup(interaction);
}
Ama çünkü iplik güvenliği ait eksikliği ortaya çıkabilir iki istenmeyen şeyler nokta olabilir:
Sıra hala boş olduğundan- sıra boş ise, Peek bir iplik A Popup birinci deyimin önüne kılınırsa Eğer bir istisna
- atacağım, başka bir iş parçacığı B bekleyen açılan A için beklemeyecek.
Popup yöntemi TaskCompletionSource
ile çalışır ve onun SetResult
yöntemini çağırmadan önce, popupQueue.Dequeue()
denir.
do
{
Task<int> result;
bool success = popupQueue.TryPeek(out result);
if (!success) break;
await result;
}
while (true);
Sonra bir AsyncProducerConsumerCollection okudum ama bu en basit çözüm olmadığından emin değilim: Ben 1. parçacığı güvenli kılmak için ConcurrentQueue
atom TryPeek
kullanma hakkında düşünüyorum.
İplik güvenliğini basit bir şekilde nasıl sağlayabilirim? Teşekkür ederim.
Sanırım kendi sorunuzu cevapladınız. ConcurrentQueue ', ihtiyacınız olan her şeye sahiptir. –
Geçerli semantik iseniz, tüm pop-up'lar görüntülenene kadar '' AddPopupAsync'' için yapılan tüm çağrılar tamamlanmayacaktır (sadece belirli bir aramanın gösterdiği gibi). İstediğiniz semantiğin bu olduğuna emin misin? –
@Stephen Cleary PopupView ve PopupViewModel tekil olduktan sonra, Popup çağrıldığında, kalıcı pop-up penceresinin durumu değişir. Ve bu yüzden sıra kullanıyorum. – user4287276