Как узнать, когда все рабочие из цикла закончены? И как «выполнить» bw_RunWorkerCompleted после всех этих работников. Я пробовал несколько способов, но я не смог. Главный рабочий всегда заканчивается первым.Multi-BackgroundWorker
.Net 3,5
using System;
using System.ComponentModel;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.WorkerSupportsCancellation = true;
bw.WorkerReportsProgress = true;
bw.RunWorkerAsync();
Console.ReadLine();
}
static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("All");
}
static void bw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 10; i++)
{
BackgroundWorker inBW = new BackgroundWorker();
inBW.DoWork += new DoWorkEventHandler(inBW_DoWork);
inBW.RunWorkerCompleted += new RunWorkerCompletedEventHandler(inBW_RunWorkerCompleted);
inBW.RunWorkerAsync(i.ToString());
}
}
static void inBW_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine(e.Result as String);
}
static void inBW_DoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(new Random().Next(1000, 5000));
e.Result = e.Argument as string;
}
}
}
Запуск асинхронной операции из асинхронной операции кажется мне бессмысленным. В конце концов, для меня единственной/основной причиной для асинхронных операций является поддержание пользовательского интерфейса. –
В этом случае .Net Framework V4 может помочь с помощью класса Task. Можете ли вы перейти к этой версии или позже? –
Да, это из-за UI –