万捷博客

万捷博客
一个知识汇聚的地方
首页 » 未分类 » C# Task异步多任务[C#源码]

C# Task异步多任务[C#源码]

C#的Task异步执行任务相对于Thread多线程可以更好的利用CPU资源,更高的工作效率。适用于不需要排序的高并发作业。

可以更高效的利用硬件资源。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

using System.Windows.Forms;

namespace 异步
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //new Task  =  创建任务,不执行,需要用 .Start() 来启动任务
            //Task.Factory.StartNew =   创建任务,并启动任务
            //Task.Run  =   把任务投递到线程池中去执行
   


            var t1 = new Task(() => TaskMethod("Task 1"));
            var t2 = new Task(() => TaskMethod("Task 2"));
            t2.Start();//启动任务
            t1.Start();//启动任务

            Task.WaitAll(t1, t2);//等待指定任务执行完毕

            Task.Run(() => TaskMethod("Task 3"));//抛出线程后继续向下执行,线程自己去找自己的位置执行

            Task.Factory.StartNew(() => TaskMethod("Task 4"));// 创建任务,并启动任务

            //标记为长时间运行任务,则任务不会使用线程池,而在单独的线程中运行,不和其他线程排队了,自己干自己的。
            Task.Factory.StartNew(() => TaskMethod("Task 5"), TaskCreationOptions.LongRunning);

            #region 常规的使用方式
            Console.WriteLine("主线程执行业务处理.");
            //创建任务
            Task task = new Task(() =>
            {
                Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作.");
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine(i);
                }
            });

            task.Start();//启动任务,并安排到当前任务队列线程中执行任务(System.Threading.Tasks.TaskScheduler)

            Console.WriteLine("主线程执行其他处理");

            task.Wait();//等待任务执行完毕。

            #endregion




        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        static void TaskMethod(string name)
        {
            Console.WriteLine("任务 {0} 在线程 {1} 上运行. 是否为线程池: {2}",
                name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);

        }

        private void button2_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 1000; i++)
            {

                //Task.Run(() => TaskMethod("Task " + i.ToString()));//i++不会等待线程执行,会自顾自的一直+,所以线程中显示的数字都是 10

                string t = i.ToString();//将I赋值到其他变量然后在传递给任务就显示正常的数字了
                Task.Run(() => TaskMethod("Task " + t));

            }
        }
    }
}

 

 

文章如无特别注明均为原创! 作者: admin, 转载或复制请以 超链接形式 并注明出处 万捷博客
原文地址《 C# Task异步多任务[C#源码]》发布于2018-11-9

打赏作者

评论

游客

看不清楚?点图切换
切换注册

登录

您也可以使用第三方帐号快捷登录

切换登录

注册