线程和Task

Task:https://www.cnblogs.com/mq0036/p/9040614.html

async/await:

await相当于分支;

Task:

task.Result task函数具有返回值
task 4 种启动方式:
1、run
2、start
3、TaskFactory
4、RunSynchronously 同步执行,阻塞主线程
task控制:
1、task1.Wait()等待某个
2、Task.WaitAll等待所有完成
3、Task.WaitAny等待任何一个
123均为阻塞线程
4、 task1.ContinueWith 一个task执行完执行下一个
5、CancellationTokenSource 调用Cannel取消任务
6、WhenAny、WhenAll和Task.Factory.ContinueWhenAll、Task.Factory.ContinueWhenAny。执行后续操作。不会阻塞

//跑一遍 看对应debug和线程id就明白了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading.Tasks;
using System.Threading;

public class TestManager : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        AsyncPrintHelloWorld();
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public async static void AsyncPrintHelloWorld()
    {
        Debug.Log("异步方法调用开始");
        Debug.Log("开始前id" + Thread.CurrentThread.ManagedThreadId); //测试结果id:1
        //这里开启了4个异步方法、并且是在同时执行
        var result1 = TMothd1();
        var result2 = TMothd2();
        var result3 = TMothd3();
        var result4 = TMothd4();
        Debug.Log("异步方法完成");
        int r1 = await result3;   //这里先等待时间最长的函数。会发现1、2、3均在在执行并完成,只是这里将主线程给阻塞了,无法继续执行下去,其实已经完成了
        Debug.Log("最长耗时任务完成");
        int r2 = await result1;
        int r3 = await result2;
        int r4 = await result4;

        Debug.Log("完成所有异步后函数线程id" + Thread.CurrentThread.ManagedThreadId); //测试结果id:1,也在主线程
        Debug.Log(r1+"-"+ r2 + "-" + r3 + "-" + r4);
    }

    /// 
    /// 这里测试一下,在这个异步函数中 await 前后的线程情况
    /// 
    /// 
    public async static Task TMothd1()
    {
        Debug.Log("函数1,await前线程id为:" + Thread.CurrentThread.ManagedThreadId); //测试结果id:1,在主线程
        return await Task.Factory.StartNew(() =>
        {
            Thread.Sleep(5 * 1000); //5秒
            Debug.Log("TMothd1 中,当前线程id为" + Thread.CurrentThread.ManagedThreadId);//测试结果id:35
            return 1;
        });
    }

    public async static Task TMothd2()
    {
        return await Task.Factory.StartNew(() =>
        {
            Thread.Sleep(10 * 1000);//10秒
            Debug.Log("TMothd2 完成,当前线程id为" + Thread.CurrentThread.ManagedThreadId);//测试结果id:38
            return 2;
        });
    }
    public async static Task TMothd3()
    {
        return await Task.Factory.StartNew(() =>
        {
            Thread.Sleep(15 * 1000);//15秒/耗时最长
            //Debug.Log("TMothd3 完成");
            return 3;
        });
    }


    public async static Task TMothd4()
    {
        Debug.Log("刚进入函数4线程id为:" + Thread.CurrentThread.ManagedThreadId); // 测试结果id:1,也在主线程
        Task task = Task.Factory.StartNew(() =>
        {
            Thread.Sleep(3 * 1000); //3秒s
            Debug.Log("TMothd4 完成,当前线程id为" + Thread.CurrentThread.ManagedThreadId); //在另一个线程
            return 3;
        });
        return await task;
        
    }

}

你可能感兴趣的:(线程和Task)