首页 > 代码库 > 并行简单示例
并行简单示例
我们以前用多线程,基本上用Thread,如果在客户端也可以用BackgroundWorker 组件来执行后台异部的一些操作,本文主要讲解taskFactory方法
//创建一个参数辅助类,可以传递多个参数 class FunPara { public int number; public string Name; } //创建多线程带有返回值的方法 public static List<string> GetNumber(FunPara fp) { List<string> list = new List<string>(); for (int i = 0; i < 1000; i++) { string str = string.Format("{0}_{1}", i + fp.number, fp.Name); list.Add(str); Console.WriteLine(str); } return list; } TaskFactory taskFactory = new TaskFactory(); //一个可以有返回值异步操作的数组 List<Task<List<string>>> tasks = new List<Task<List<string>>>(); //建立带返回值的委托 Func<object, List<string>> action = (object arg) => { FunPara arg0 = arg as FunPara; return GetNumber(arg0); }; //此方法创建并启动Task,本示例使用3个线程 for (int i = 0; i < 3; i++) { FunPara funp = new FunPara(); funp.number = i + 1; if (i == 0) { funp.Name = "Bob"; } else if (i == 1) { funp.Name = "John"; } else { funp.Name = "Kake"; } tasks.Add(taskFactory.StartNew(action, funp)); } //使用一个task来接执行接收返回值 Task taskList = null; List<string> listAll = new List<string>(); object lockObject = new object(); if (tasks.Count > 0) { //Creates a continuation task that starts when a set of specified tasks has completed. taskList = Task.Factory.ContinueWhenAll<List<string>>(tasks.ToArray(), completedTasks => { foreach (Task<List<string>> item in completedTasks) { List<string> list = item.Result; lock (lockObject) { listAll.AddRange(list.ToArray()); } } }); } //等待所有线程执行完毕 taskList.Wait(); //输出结果 foreach (string str in listAll) { Console.WriteLine(str); }
上述方法基本已解决并行并接收异步的返回值的问题,对初学者来说是非常好用的一个方法,另外,因为某些异常难以捕捉,在线程启动以前运行这一段
TaskScheduler.UnobservedTaskException += (object sender, UnobservedTaskExceptionEventArgs eventArgs) => { eventArgs.SetObserved(); eventArgs.Exception.Flatten().Handle(ex => { Console.WriteLine("Exception:{0}", ex.Message); return true; }); };
好了,写到这里,这是个完整的带有接收返回值的并行示例,mark一下,方便使用。
并行简单示例
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。