Tôi đang cố gắng thiết kế cấu trúc dữ liệu xung quanh một ngăn xếp chặn cho đến khi ngăn xếp có sẵn một mục. Tôi đã cố gắng sử dụng một AutoResetEvent
nhưng tôi nghĩ rằng tôi hiểu lầm như thế nào mà quá trình đồng bộ hóa hoạt động. Về cơ bản, nhìn vào mã sau đây, tôi đang cố gắng để Pop từ ngăn xếp khi không có gì có sẵn.AutoResetEvent và nhiều Bộ
Dường như AutoResetEvent
hoạt động như một semaphore. Đúng không? Tôi chỉ có thể loại bỏ các Set()
trong BlockingStack.Get()
và được thực hiện với nó? Hoặc điều đó sẽ dẫn đến một tình huống mà tôi chỉ sử dụng một trong các mục ngăn xếp của tôi.
public class BlockingStack
{
private Stack<MyType> _internalStack;
private AutoResetEvent _blockUntilAvailable;
public BlockingStack()
{
_internalStack = new Stack<MyType>(5);
_blockUntilAvailable = new AutoResetEvent(false);
for (int i = 0; i < 5; ++i)
{
var obj = new MyType();
Add(obj);
}
}
public MyType Get()
{
_blockUntilAvailable.WatiOne();
lock (_internalStack)
{
var obj = _internalStack.Pop();
if (_internalStack.Count > 0)
{
_blockUntilAvailable.Set(); // do I need to do this?
}
return obj;
}
}
public void Add(MyType obj)
{
lock (_internalStack)
{
_internalStack.Push(obj);
_blockUntilAvailable.Set();
}
}
}
Giả định của tôi là AutoResetEvent
resets cho tất cả các chủ đề chờ đợi khi một người được qua các cuộc gọi WaitOne()
chức năng. Tuy nhiên, có vẻ như nhiều chủ đề đang nhận được in Trừ khi tôi đã sai lầm logic của tôi ở đâu đó.
CHỈNH SỬA: Đây là dành cho Silverlight.
Có liên quan: http://stackoverflow.com/questions/3797892/does-monitor-wait-needs-synchronization/3798033#3798033 –