zoukankan      html  css  js  c++  java
  • 并行简单示例

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

  • 相关阅读:
    为图片指定区域添加链接
    数值取值范围问题
    【leetcode】柱状图中最大的矩形(第二遍)
    【leetcode 33】搜索旋转排序数组(第二遍)
    【Educational Codeforces Round 81 (Rated for Div. 2) C】Obtain The String
    【Educational Codeforces Round 81 (Rated for Div. 2) B】Infinite Prefixes
    【Educational Codeforces Round 81 (Rated for Div. 2) A】Display The Number
    【Codeforces 716B】Complete the Word
    一个简陋的留言板
    HTML,CSS,JavaScript,AJAX,JSP,Servlet,JDBC,Structs,Spring,Hibernate,Xml等概念
  • 原文地址:https://www.cnblogs.com/sky2014/p/4205966.html
Copyright © 2011-2022 走看看