zoukankan      html  css  js  c++  java
  • 新手浅谈C#Task异步编程

     Task是微软在.net framework 4.0发布的新的异步编程的利器,当然4.5新增了async、await,这儿我们先说Task相关。

      在实际编程中,我们用的较多的是Task、Task.Factory.StarNew、Task.Run,接下来简单的表述下我的理解。

      

    复制代码
    //传入Func委托
    Task<int> task = new Task<int>(a => { return (int)a + 1; }, 1);
    task.Start();
     Console.WriteLine(task.Result);
    
    //传入Action委托
    Task task1 = new Task(() => Console.WriteLine("a"));
    task1.Start();
    复制代码

    实例化的Task对象,需要调用Start来启动任务,如果使用Task.Factory.StarNew,则不用调用Start方法来启动任务。

    var task = Task.Factory.StartNew<int>(() => { return 1; });
    Console.WriteLine(task.Result);
    
    var task1 = Task.Factory.StartNew(() => Console.WriteLine("这是StartNew......"));

    Task.Run的跟Task.Factory.StarNew和new Task相差不多,不同的是前两种是放进线程池立即执行,而Task.Run则是等线程池空闲后在执行。

    Run方法只接受无参的Action和Func委托,另外两个接受一个object类型的参数。

    在msdn中TaskFactory.StartNew的备注信息如下:

    它们都可以调用Wait方法来阻塞当前线程,还可以通过Task.Result来获取返回值,当然它也会阻塞当前线程。

    接下来再说说常用的ContinueWith,这个说白了就是在某个任务执行完的延续,类似callback

    var task = Task.Factory.StartNew<int>(() => { return 1; });
    Console.WriteLine(task.Result);
    var result = task.ContinueWith<int>((aa => { return aa.Result + 1; }));
    Console.WriteLine(result.Result);

    continuewith接受action或func委托,委托的第一个参数都是task类型,可以通过它访问先前的task对象

     这里有个下提示,关于线程安全的(参考的这里http://q.cnblogs.com/q/65147/),代码如下

    复制代码
    //这是线程不安全,直接调用外部参数
    static void TestRun(string Name,int Age)
    {
        Task.Factory.StartNew(() => Console.WriteLine("name:{0} age:{1}", Name, Age));
    }
    
    //如果你确定底层封装好了,可以像上面那样写,但建议写成下面这种
    static void TestRun(string Name,int Age)
    {
        Task.Factory.StartNew(obj =>
        {
            var o = (dynamic)obj;
            Console.WriteLine("name:{0} age:{1}", o.Name, o.Age);
        }, new { Name, Age });
    }
    复制代码
  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/wwwbdabc/p/10405394.html
Copyright © 2011-2022 走看看