gpt4 book ai didi

C# BackgroundWorker 并行调用 DoWorkEventHandler

转载 作者:行者123 更新时间:2023-11-30 22:39:27 28 4
gpt4 key购买 nike

这是我的情况:
我有一个 ThreadManager 启动 BackgroundWorkers;我订阅了 doWork 事件以在其中记录内容。我还订阅了 BackgroundWorker 本身的 doWork 事件来处理内容。好吧,第一个订阅在第二个订阅引发后引发事件。

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
}
}

出于某种原因,我连续收到所有“Ping”,并在几分钟后开始收到 Pong。

我在这里遗漏了什么吗?

编辑:
我本身不使用“控制台”,而是使用异步记录器(这是示例)。我在“PONG”这一行仔细观察了调试过程,在“PING”启动后并没有命中。

我的解决方案:这正是我希望避免的额外代码,但我最终无法减轻痛苦。所以这里是,对于那些有同样问题并且在这篇文章上绊倒的人:

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
}
}

最佳答案

您缺少以下内容:
DoWork 事件的订阅者不是并行调用的,而是以串行方式调用的,即首先使用 PING 调用您的处理程序,然后使用 PONG 调用处理程序。因此,当 PING 处理程序需要 3 分钟时,PONG 处理程序将在您调用 RunWorkerAsync 后三分钟执行。

关于C# BackgroundWorker 并行调用 DoWorkEventHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5702730/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com