码迷,mamicode.com
首页 > 编程语言 > 详细

C#多线程编程のTask(任务)

时间:2017-08-26 04:56:00      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:任务   src   png   编程   输出   component   return   loaded   img   

Task是.NET4.5加入的,跟线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread每次实例化都会创建一个新的线程。

 

长耗时操作是不是常用 await Task.Run( )?

 

看下面代码:

namespace WpfApplication6
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();
            ConsoleManager.Show();//打开控制台窗口  
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Console.WriteLine("主线程启动");
            Task task = Task.Run(() => {
                Thread.Sleep(1500);
                Console.WriteLine("task启动");
            });
            Thread.Sleep(300);
            task.Wait();
            Console.WriteLine("主线程结束");
        }

    }
}

  

结果:

技术分享

分析:

开启新任务的方法:Task.Run()或者Task.Factory.StartNew(),开启的是后台线程

要在主线程中等待后台线程执行完毕,可以使用Wait方法(会以同步的方式来执行)。不用Wait则会以异步的方式来执行。

thread和Task的区别,thread new多少个就会创建多少个线程,而task是利用线程池中的线程。

 

task<TResult>就是有返回值的Task,TResult就是返回值类型。示例:

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Console.WriteLine("主线程开始");
            //返回值类型为string
            Task<string> task = Task<string>.Run(() => {
                Thread.Sleep(2000);
                return Thread.CurrentThread.ManagedThreadId.ToString();
            });
            //会等到task执行完毕才会输出;
            Console.WriteLine(task.Result);
            Console.WriteLine("主线程结束");
        }

 

通过task.Result可以取到返回值,若取值的时候,后台线程还没执行完,则会等待其执行完毕!

简单提一下:

Task任务可以通过CancellationTokenSource类来取消。

 

 

C#多线程编程のTask(任务)

标签:任务   src   png   编程   输出   component   return   loaded   img   

原文地址:http://www.cnblogs.com/xietianjiao/p/7429742.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!