并行简单示例

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

原文地址:https://www.cnblogs.com/sky2014/p/4205966.html