首页 > 代码库 > 并行简单示例

并行简单示例

我们以前用多线程,基本上用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一下,方便使用。

并行简单示例