using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
namespace EventOrderingIssue
static BackgroundWorker backgroundWorker;
static int reportCount = 0;
static List<string> received = new List<string>();
public static void Main(string[] args)
backgroundWorker = new BackgroundWorker()
WorkerReportsProgress = true,
backgroundWorker.DoWork += BackgroundWorker_DoWork;
backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged;
backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
backgroundWorker.RunWorkerAsync();
Console.WriteLine(string.Join("\n", received));
private static void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
private static void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
IEnumerable<string> hugeState = Enumerable.Range(0, 10000000).Select(i => $"String {i}");
backgroundWorker.ReportProgress(1, hugeState);
backgroundWorker.ReportProgress(99, new string[] { "Last" });;
private static void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
received.Add(e.ProgressPercentage.ToString());
received.Add(((IEnumerable<string>)e.UserState).Last());