protected void ExecuteSubTasks(List <ThreadStart> tasks, int threadCount) { List <List <ThreadStart> > splittedTasks = new List <List <ThreadStart> >(); for (int i = 0; i < threadCount; i++) { splittedTasks.Add(new List <ThreadStart>()); } for (int i = 0; i < tasks.Count; i++) { splittedTasks[i % threadCount].Add(tasks[i]); } bool[] completions = new bool[threadCount]; SubTaskParam[] parameters = new SubTaskParam[threadCount]; for (int i = 0; i < threadCount; i++) { Thread t = new Thread(new ParameterizedThreadStart(SubTaskMain)); parameters[i] = new SubTaskParam(); parameters[i].index = i; parameters[i].tasks = splittedTasks[i]; parameters[i].complete = completions; t.Start(parameters[i]); } while (!AllFinished(completions)) { Thread.Sleep(1000); OnLoadProgress?.Invoke(GetProgress(parameters)); } }
private void SubTaskMain(object obj) { SubTaskParam param = obj as SubTaskParam; int i = 0; foreach (ThreadStart runnable in param.tasks) { runnable(); i++; param.progress = i * 100.0 / param.tasks.Count; } lock (SubTaskParam.LOCK) { param.complete[param.index] = true; } }