C#等待所有线程完成执行
发布时间:2020-12-15 23:29:06 所属栏目:百科 来源:网络整理
导读:我试过这个…… public ArrayList GetAllObjectAttributes() { ListTask taskList = new ListTask(); ArrayList allObjectAttributes = new ArrayList(); taskList.Add(Task.Factory.StartNew(() = { allObjectAttributes.Add(GetObjectAttributes(TreeViewA
我试过这个……
public ArrayList GetAllObjectAttributes() { List<Task> taskList = new List<Task>(); ArrayList allObjectAttributes = new ArrayList(); taskList.Add(Task.Factory.StartNew(() => { allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.Folder));})); taskList.Add(Task.Factory.StartNew(() => { allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.XMLFile)); })); taskList.Add(Task.Factory.StartNew(() => { allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.TextFile)); })); taskList.Add(Task.Factory.StartNew(() => { allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.Parent)); })); Task.WaitAll(taskList.ToArray()); return allObjectAttributes; } 还有这个… public ArrayList GetAllObjectAttributes() { Thread[] threads = new Thread[4]; ArrayList allObjectAttributes = new ArrayList(); threads[0] = new Thread(() => allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.Folder))); threads[1] = new Thread(() => allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.XMLFile))); threads[2] = new Thread(() => allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.TextFile))); threads[3] = new Thread(() => allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.Parent))); foreach(Thread thread in threads) { thread.Start(); thread.Join(); } return allObjectAttributes; } 这也是…… public ArrayList GetAllObjectAttributes() { Thread[] threads = new Thread[4]; ArrayList allObjectAttributes = new ArrayList(); threads[0] = new Thread(() => allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.Folder))); threads[1] = new Thread(() => allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.XMLFile))); threads[2] = new Thread(() => allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.TextFile))); threads[3] = new Thread(() => allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.Parent))); foreach(Thread thread in threads) { thread.Start(); } while(threads[0].IsAlive || threads[1].IsAlive || threads[2].IsAlive || threads[3].IsAlive) { Thread.Sleep(500); } return allObjectAttributes; } 我也试过了 我仍然在allObjectAttributes中的一个arraylist项中得到null. 但是,当我这样做的时候 public ArrayList GetAllObjectAttributes() { ArrayList allObjectAttributes = new ArrayList(); allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.Folder))); allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.XMLFile))); allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.TextFile))); allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.Parent))); return allObjectAttributes; } 我从来没有在arraylist项目中获得null项. >等到所有线程完成后,我做错了什么? private List GetObjectAttributes(TreeViewAttrs tv) { List objectAttributes = new List(); string command = "COMMAND_TO_EXECUTE"; if (command != "") { List results = RunCommand(command); if (results == null) { return null; } if (results.Count > 0) { foreach (string result in results) { if (!result.Contains("" + tv + "")) { string[] res = reformatResponseString(result); //reformat the strings as per custom structure if (res != null) { objectAttributes.Add(res); } } } return objectAttributes; } } return null; } 解决方法
使用线程安全集合(.NET 4.0兼容)稍微改进:
List<Task> taskList = new List<Task>(); ConcurrentBag<object> allObjectAttributes = new ConcurrentBag<object>(); taskList.Add(Task.Factory.StartNew(() => allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.Folder)))); taskList.Add(Task.Factory.StartNew(() => allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.XMLFile)))); taskList.Add(Task.Factory.StartNew(() => allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.TextFile)))); taskList.Add(Task.Factory.StartNew(() => allObjectAttributes.Add(GetObjectAttributes(TreeViewAttrs.Parent)))); Task.WaitAll(taskList.ToArray()); return allObjectAttributes; 替代方法:完成所有任务后使用Task.Result(不再需要线程安全集合,因为只有一个线程修改了ArrayList): Task<object>[] taskList = { Task.Factory.StartNew(() => (object)GetObjectAttributes(TreeViewAttrs.Folder)),Task.Factory.StartNew(() => (object)GetObjectAttributes(TreeViewAttrs.XMLFile)),Task.Factory.StartNew(() => (object)GetObjectAttributes(TreeViewAttrs.TextFile)),Task.Factory.StartNew(() => (object)GetObjectAttributes(TreeViewAttrs.Parent)) }; Task.WaitAll(taskList); ArrayList allObjectAttributes = new ArrayList(); foreach (Task<object> task in taskList) { allObjectAttributes.Add(task.Result); } return allObjectAttributes; 使用Task.WhenAll(仅限.NET 4.5)显着改进: object[] allObjectAttributes = await Task.WhenAll( Task.Run(() => GetObjectAttributes(TreeViewAttrs.Folder)),Task.Run(() => GetObjectAttributes(TreeViewAttrs.XMLFile)),Task.Run(() => GetObjectAttributes(TreeViewAttrs.TextFile)),Task.Run(() => GetObjectAttributes(TreeViewAttrs.Parent)) ); return allObjectAttributes; *注意:我使用了对象作为通用参数,因为你保留了未指定的GetObjectAttributes的返回类型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |