• 并行简单示例


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

  • 相关阅读:
    Objective-C马路成魔【14-关键C语言功能】
    js正则表达式语法
    Python 得到Twitter所有用户friends和followers
    error:stray&#39;243&#39;in program
    VC各种方法获得的窗口句柄
    新东方雅思词汇---5.2
    php中this,self,parent三个关键字的区别辨析
    英语影视台词---一、少年派的奇幻漂流
    英语常用单词分类---1
    amazeui的表单开关插件的自定义事件必须添加.bootstrapSwitch 命名空间,给了我们什么启示
  • 原文地址:https://www.cnblogs.com/sky2014/p/4205966.html
Copyright © 2020-2023  润新知