我不知道如何確保一個線程正在等待事件。 讓說我是引發事件的組件:如何確保線程正在等待事件?
public delegate void TestHandler(object sender, EventArgs eventArgs);
class Producer
{
public event TestHandler Handler;
public void InvokeHandler(EventArgs eventargs)
{
var handler = Handler;
if (handler != null) handler(this, eventargs);
}
public Producer()
{
Task.Factory.StartNew(() =>
{
while (true)
{
Thread.Sleep((new Random()).Next(0,100));
InvokeHandler(new EventArgs());
} }); } }
與聽衆:
class Listener
{
private readonly BlockingCollection<EventArgs> _blockingCollection;
public Listener()
{
var producer = new Producer();
_blockingCollection = new BlockingCollection<EventArgs>(10);
producer.Handler += producer_Handler;
}
void producer_Handler(object sender, EventArgs eventArgs)
{
_blockingCollection.TryAdd(eventArgs); //no error handling for simplicity sake
}
internal void ProcessEvents()
{
while (true)
{
EventArgs eventArgs;
try
{
if (_blockingCollection.TryTake(out eventArgs))
Console.WriteLine("Received event");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
} } } }
如果我將開始它:
class Program
{
static void Main(string[] args)
{
var listner = new Listener();
listner.ProcessEvents();
} }
我得到預期的行爲(從我時不時收到事件通過阻止收集。
但是,如果我會w在任務中說唱這個電話:
Task.Factory.StartNew(() => {
var listner = new Listener();
listner.ProcessEvents(); });
我永遠不會進入處理部分。 任何想法爲什麼會這樣?我錯過了明顯的東西嗎?
一邊,有人知道一個模式,這將有助於這裏很好的描述? 我正在尋找在一個線程(最好不是主應用程序線程)上拾取事件,然後在一個單獨的線程上同時處理它們,如果事件數量變得太高(典型的閾值我假設)
在此先感謝,
當你說你在開始任務時從未到達處理部分,發生了什麼?該程序是否簡單退出? – 2011-02-22 23:15:39
#paul,@stic,就是我想問的。錯誤消息和堆棧轉儲請。我們可以看看這個測試設置的一個神器。 – 2011-02-22 23:20:03
Paul,Henk - 會重複練習幾次,但它看起來像一個乾淨的運行,只是完成忽略到while(true)循環 – stic 2011-02-23 00:12:59