Обычно я в итоге вызываю работника параметром, например так:
backgroundWorker.RunWorkerAsync(<some argument here>);
Затем внутри вашего метода DoWork вы можете извлечь аргумент из e.Argument
, и в зависимости от того, что это за аргумент, вы знаете, что вы хотите с ним сделать.
Если вам не нужен аргумент для чего-либо еще, вы можете создать перечисление со значениями, которые вам нужны, например Search
, Load
и т. Д., И передать его, а затем проверить это значение в DoWork, чтобы выберите то, что вы хотите сделать. Помните, что вы должны привести обратно к перечислению внутри Dowork, поскольку e.Argument является объектом.
Что касается RunWorkerCompleted, вы можете заполнить e.Result значением внутри DoWork, а также извлечь его из метода RunWorkerCompleted.
Это лучший способ сделать это, и он будет полностью безопасен для потоков.