Кажется, я не понимаю концепцию пользовательского состояния в фоновом режиме.Я столкнулся с проблемой в приложении, над которым я работаю, и мне нужно объяснить, почему происходит то, чего я не ожидал.
Я создал демонстрационное приложение, чтобы проще воспроизвести проблему:
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();
}
}
Это результат:
Что я наденуЯ не понимаю, почему результат расчета всегда один и тот же, в то время как вы можете ясно видеть, что он должен отличаться при каждом прогоне вычисления в цикле forWork метода DoWork.