這是我的情況:
我有一個ThreadManager啓動BackgroundWorkers;我訂閱doWork事件來記錄其中的東西。我還訂閱了BackgroundWorker中的doWork事件來處理內容。 那麼,第一次訂閱引發了第二次提出後的事件。C#BackgroundWorker並行調用DoWorkEventHandler
class ThreadManager
{
//(...)
for (int i = 0; i<100; i++)
{
myWorker wk = new myWorker();
wk.DoWork += new DoWorkEventHandler(wk_DoWork);
}
//(...)
public void wk_DoWork(object sender, DoWorkEventArgs e)
{
Console.Out.Write("PONG");
//(...) Workers Management logic (Pooling, priority, etc.)
}
}
internal class myWorker : : BackgroundWorker
{
//(...)
DoWork += new DoWorkEventHandler(DoMe);
//(...)
void DoMe(object sender, DoWorkEventArgs e)
{
Console.Out.Write("PING");
//(...) Run a 2-3mn file reading process
}
}
由於某種原因,我將所有「Pings」連成一行,並在幾分鐘後纔開始獲得Pongs。
有什麼我在這裏失蹤?
編輯:
我不使用「控制檯」本身,而是異步記錄器(這是爲例子)。我一直在仔細觀察「PONG」線上的調試過程,並且在「PING」啓動後它不會受到影響。
我的解決方案: 這正是我希望避免的額外代碼,但我不能最終減輕痛苦。 所以這裏是,對於那些具有相同ISSU和磕磕絆絆對這個職位:
class ThreadManager
{
//(...)
for (int i = 0; i<100; i++)
{
myWorker wk = new myWorker();
wk.StartedEvent += new myWorker.startDelegate(wk_Started);
}
//(...)
public void wk_Started(params-if-needed)
{
Console.Out.Write("PONG");
//(...) Do Stuff
}
}
internal class myWorker : BackgroundWorker
{
public delegate void startDelegate(string ID);
public event startDelegate StartedEvent;
protected override void OnDoWork(DoWorkEventArgs e)
{
StartedEvent(ID); //put whatever parameter suits you or nothing
base.OnDoWork(e);
e.Result = e.Argument;
Console.Out.Write("PING");
//(...) Do Stuff
}
}
Side-note,2-3分鐘對於Bgw(ThreadPool)來說很長。 – 2011-04-18 12:28:20
@亨克:你對這個估計有什麼解釋嗎? – 2011-04-18 12:48:03