Hej, mam taki koncept:
public class Queue
{
public Queue()
{
locker = new object();
queue = new Dictionary<int, object>();
}
public async Task<int> AddToQueueAsync(object item)
{
return await Task.Run(() =>
{
var randomID = 1234234;
lock (locker) queue.Add(randomID, item);
return randomID;
});
}
public async Task ReleaseQueueAsync()
{
await Task.Run(() =>
{
Dictionary<int, object> copy;
lock (locker)
{
copy = new Dictionary<int, object>(queue);
queue.Clear();
}
foreach (var item in copy) { } // ...
});
}
private readonly object locker;
private readonly Dictionary<int, object> queue;
}
i się zastanawiam czy jak wywołam tak na luźno:
AddToQueueAsync(null);
ReleaseQueueAsync();
to może się zdarzyć tak że nie zdąży się dodać do kolejki przed jej zwolnieniem? Że jakimś cudem lock w metodzie ReleaseQueueAsync wejdzie jako pierwszy?