C# 异步 Task 创建

Task 默认使用线程池,而Thread不是

一、new Thread

1、语法

a、无参、无返回值

Task task = new Task(方法);
task.Start()

b、有参、无返回值

注意:参数类型 object,在方法中做转换

Task task = new Task(方法,方法参数);
// 开启
task.Start();

c、有参、有返回值

注意:这样使用返回值会 阻塞

Task<返回值类型> task = new Task<返回值类型>(方法,方法参数);
// 开启
task.Start();
// 获得返回值
返回值类型 v = task.Result;

2、案例

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

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

        private void button1_Click(object sender, EventArgs e)
        {   
            // 含返回值
            Task<int> task = new Task<int>(Add, 10);
            
            task.Start();
            int result = task.Result;
            MessageBox.Show(result.ToString());
        }

        public void MyThread(object o) 
        {
            if (this.label1.InvokeRequired)
            {
                Action<string> action = (x) => { this.label1.Text = x; };
                this.label1.Invoke(action, $"Hello, {o.ToString()}");
            }
            else
            {
                this.label1.Text = $"World, {o.ToString()}";
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {   
            // 不含返回值
            Task task = new Task(MyThread, "tom");
            task.Start();
        }

        public int Add(object o) 
        {
            var v = int.Parse(o.ToString());
            
            return v + 10;
        }
    }
}

二、Task.Factory.StartNew

1、语法

a、无参、无返回值

Task.Factory.StartNew(方法);

b、有参、无返回值

Task.Factory.StartNew(方法,方法参数);

c、有参、有返回值

 var task = Task.Factory.StartNew(方法, 方法的参数);
// 结果 
var result = task.Result;
 MessageBox.Show(result.ToString());

注意:方法的参数类型为 object,需要在方法中进行转换,接收返回值,会发生阻塞,不需要Start

2、案例

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

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

        private void button1_Click(object sender, EventArgs e)
        {
            // 含返回值
            var task = Task.Factory.StartNew(Add, 10);
            var result = task.Result;
            MessageBox.Show(result.ToString());
            
        }

        public void MyThread(object o) 
        {
            if (this.label1.InvokeRequired)
            {
                Action<string> action = (x) => { this.label1.Text = x; };
                this.label1.Invoke(action, $"Hello, {o.ToString()}");
            }
            else
            {
                this.label1.Text = $"World, {o.ToString()}";
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // 不含返回值
            Task.Factory.StartNew(MyThread, "tom");
        }

        public int Add(object o) 
        {
            var v = int.Parse(o.ToString());
            
            return v + 10;
        }

        public void Add2()
        {
            MessageBox.Show("Hi");
        }
    }
}

三、Task.Add

1、语法

a、无返回值

Task.Run(方法);

b、有返回值

var task = Task<int>.Run(方法);
var result =task.Result;
MessageBox.Show(result.ToString());

注意:不需要start方法,不能传参,等待返回值会阻塞

2、案例

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

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

        private void button1_Click(object sender, EventArgs e)
        {
            // 无返回值
            Task.Run(Add2);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // 不含返回值
            var task = Task<int>.Run(Add3);
            var result =task.Result;
            MessageBox.Show(result.ToString());
        }

        public void Add2()
        {
            MessageBox.Show("Hi");
        }

        public int Add3()
        {
            return 10;
        }
    }
}

 

posted @ 2025-06-16 16:48  市丸银  阅读(85)  评论(0)    收藏  举报