gpt4 book ai didi

c# - ProgressChanged 回调中 BackgroundWorker 和 UserState 的问题

转载 作者:行者123 更新时间:2023-11-30 22:41:35 26 4
gpt4 key购买 nike

看来我不明白backgroundworker 中userstate 的概念。我在我正在处理的应用程序中遇到问题,我需要解释为什么会发生我没有预料到的事情。

我构建了一个演示应用程序来更简单地重现该问题:

public class Tester
{
private BackgroundWorker _worker = new BackgroundWorker();

public void performTest()
{
Tester tester = new Tester();
tester.crunchSomeNumbers((obj, arg) =>
{
WorkerArgument userState = arg.UserState as WorkerArgument;
Console.WriteLine(string.Format("Progress: {0}; Calculation result: {1}", arg.ProgressPercentage, userState.CalculationResult));
});
}

public void crunchSomeNumbers(Action<object,ProgressChangedEventArgs> onProgressChanged)
{
_worker.DoWork += new DoWorkEventHandler(worker_DoWork);
_worker.ProgressChanged += new ProgressChangedEventHandler(onProgressChanged);
_worker.WorkerReportsProgress = true;
_worker.RunWorkerAsync(new WorkerArgument { CalculationResult=-1, BaseNumber = 10 });
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
WorkerArgument arg = e.Argument as WorkerArgument;

for (int i = 0; i < 10; i++)
{
// calculate total with basenumber
double result = arg.BaseNumber * (i * 10);
arg.CalculationResult = result;
worker.ReportProgress(i * 10, arg);
}
}

public class WorkerArgument
{
public int BaseNumber { get; set; }
public double CalculationResult { get; set; }
}
}

如果您在控制台应用程序中运行此代码:

class Program
{
static void Main(string[] args)
{
Tester tester = new Tester();
tester.performTest();

Console.ReadLine();
}
}

这是结果:

http://img684.imageshack.us/img684/1509/bgwproblem.png

我不明白的是为什么计算结果总是相同的,而你可以清楚地看到它在 DoWork 方法的 forloop 中运行的每次计算都应该不同。

最佳答案

您假设事件在循环的下一次迭代之前引发并执行。不幸的是,这是不正确的。

发生的事情是您的 for 循环在执行第一个事件之前完成。因此 userState.CalculationResult 在调用 Console.WriteLine 之前处于 900。你如果换为for top to

for (int i = 0; < 1000000; i++)

您应该会看到数字有所增加,但在所有事件执行完之前就达到了最大数字。

另一种方法是在调用 worker.ReportProgress 之前放置一个 Console.WriteLine。您会看到 for 循环的完成顺序与事件报告不同。它在第一个事件代码输出时不会像 Console 那样完整。WriteLine 是一个非常慢的调用,会大大减慢 for 循环的执行速度。

要记住多线程的一个令人兴奋的问题是调用事件是非阻塞的。

关于c# - ProgressChanged 回调中 BackgroundWorker 和 UserState 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4760878/

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