gpt4 book ai didi

c# - BackgroundWorker 行为怪异

转载 作者:太空宇宙 更新时间:2023-11-03 19:34:20 26 4
gpt4 key购买 nike

我正在编写一些调用服务的代码。此服务调用可能会失败,如果失败,我希望系统重试,直到成功或时间过长。

我想知道我哪里出错了,因为下面的代码似乎没有正常工作...它随机只执行一到四个循环...

protected virtual void ProcessAsync(object data, int count)
{
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
throw new InvalidOperationException("oh shiznit!");
};
worker.RunWorkerCompleted += (sender, e) =>
{
//If an error occurs we need to tell the data about it
if (e.Error != null)
{
count++;
System.Threading.Thread.Sleep(count * 5000);
if (count <= 10)
{
if (count % 5 == 0)
this.Logger.Fatal("LOAD ERROR - The system can't load any data", e.Error);
else
this.Logger.Error("LOAD ERROR - The system can't load any data", e.Error);
this.ProcessAsync(data, count);
}
}
};
worker.RunWorkerAsync();
}

干杯安东尼

更新:

我已将我的代码切换为使用 ThreadPool.QueueUserWorkItem...自从这样做后,我的问题就消失了,并且在语义上我可以做同样的事情。感谢大家的帮助。

最佳答案

我稍微修改了你的代码,在运行 10 次迭代(VS 2008 Express)时没有任何问题,这让我想到了这个:Is this the actual code and if not, are you确定您已发送足够多的信息来重现该问题?

如果让我大胆猜测,我会说您发送的计数会发生变化,例如 count % 5 > 0 并且 Logger 中会抛出一个异常。致命的

private void button1_Click(object sender, EventArgs e)
{
ProcessAsync("beer", 1);
}

protected virtual void ProcessAsync(object data, int count)
{
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
throw new InvalidOperationException("oh shiznit!");
};
worker.RunWorkerCompleted += (sender, e) =>
{
//If an error occurs we need to tell the data about it
if (e.Error != null)
{
count++;
//System.Threading.Thread.Sleep(count * 5000);
if (count <= 10)
{
if (count % 5 == 0)
this.Logger.Fatal("LOAD ERROR - The system can't load any data - " + count.ToString(), e.Error);
else
this.Logger.Error("LOAD ERROR - The system can't load any data - " + count.ToString(), e.Error);
this.ProcessAsync(data, count);
}
}
};
worker.RunWorkerAsync();
}

SomeLogger Logger = new SomeLogger();

class SomeLogger
{
public void Fatal(string s, Exception e)
{
System.Diagnostics.Debug.WriteLine(s);
}

public void Error(string s, Exception e)
{
System.Diagnostics.Debug.WriteLine(s);
}
}

编辑:一个建议
围绕对 Logger.Fatal 的调用进行 try-catch,看看会发生什么。

编辑:另一个建议
我怀疑您没有共享足够的代码来帮助我们。这里成功的关键是将问题隔离在一个虚拟项目中,该项目只有足够的代码来显示失败。我愿意打赌,如果你能做到这一点,你很可能不需要在此处将其作为问题发布...

您可以从我的假设开始,应该会发现它工作得很好。然后开始将通用代码更改为您实际使用的代码(我将从 Logger.Fatal 的实际实现开始)。该错误可能会在短期内变得非常明显。

关于c# - BackgroundWorker 行为怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2808050/

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