C# 委托和Thread多線程示例

1.委托示例(泛型)
2.異步委托示例(泛型)(有參有返回)
3.Thread異步多線程示例(無參無返回)(有參無返回)
4.Task異步多線程示例(有參無返回)

class Program
{
    // 定義泛型委托 有參有返回
    delegate T MyDelegate<T>(T a, T b, DateTime dt);

    static string Tesla(string a, string b, DateTime dt)
    {
        Console.WriteLine("我是Tesla的 " + a + " 和 " + b + " dt:" + dt);
        Thread.Sleep(2000);
        return "return:S3XY Tesla a=" + a + " b=" + b + " dt:" + dt;
    }

    static string BiliBili(string a, string b, DateTime dt)
    {
        Console.WriteLine("我是BiliBili的 " + a + " 和 " + b + " dt:" + dt + " | 線程ID:" + Thread.CurrentThread.ManagedThreadId);
        Thread.Sleep(5000);
        return "return:BiliBili = " + a + " + " + b + " dt:" + dt + " | 線程ID:" + Thread.CurrentThread.ManagedThreadId;
    }
    static void AcFun(object obj)
    {
        Console.WriteLine("我是有參無返回AcFun的 " + obj.ToString() + " | 線程ID:" + Thread.CurrentThread.ManagedThreadId);
        Thread.Sleep(5000);
    }

    static void Main(string[] args)
    {
        // 同步泛型委托
        Console.WriteLine("-------------------------------同步泛型委托--------------------------------");
        // 同步調(diào)用方式1
        MyDelegate<string> myDelegate_spaceX = ((a, b, dt) =>
        {
            Console.WriteLine("我是spaceX的 " + a + " 和 " + b + " dt:" + dt);
            Thread.Sleep(2000);
            return "return:星辰大海 a=" + a + " b=" + b;
        });
        string str_spaceX = myDelegate_spaceX("獵鷹", "星艦", DateTime.Now);
        Console.WriteLine(str_spaceX);
        Console.WriteLine();

        // 同步調(diào)用方式2
        MyDelegate<string> myDelegate_Tesla_S = new MyDelegate<string>(Tesla);
        string str_Model_S = myDelegate_Tesla_S("Model S", "Model 3", DateTime.Now);
        Console.WriteLine(str_Model_S);
        Console.WriteLine();

        // 同步調(diào)用方式3
        MyDelegate<string> myDelegate_Tesla_3 = Tesla;
        string str_Model_3 = myDelegate_Tesla_3("Model 3", "Model X", DateTime.Now);
        Console.WriteLine(str_Model_3);
        Console.WriteLine();

        // 同步調(diào)用方式4
        MyDelegate<string> myDelegate_Tesla_X = Tesla;
        string str_Model_X = myDelegate_Tesla_X.Invoke("Model X", "Model Y", DateTime.Now);
        Console.WriteLine(str_Model_X);
        Console.WriteLine();



        // 異步多線程(無參無返回) ThreadStart委托
        Console.WriteLine("-------------------------------異步多線程(無參無返回) ThreadStart委托--------------------------------");
        Thread thread_AcFun1 = new Thread(new ThreadStart(() =>
        {
            Thread.Sleep(10000);
            Console.WriteLine("我是無參無返回AcFun | 線程ID:" + Thread.CurrentThread.ManagedThreadId);
        }));
        thread_AcFun1.IsBackground = true;
        thread_AcFun1.Priority = ThreadPriority.AboveNormal;// 線程優(yōu)先級(jí)0-4 0最小優(yōu)先級(jí),4最大優(yōu)先級(jí),默認(rèn)是2
        thread_AcFun1.Start();
        thread_AcFun1.Join();//主線程阻塞,等待分支線程運(yùn)行結(jié)束
        Console.WriteLine();

        // 異步多線程(有參無返回) ParameterizedThreadStart委托
        Console.WriteLine("-------------------------------異步多線程(有參無返回) ParameterizedThreadStart委托--------------------------------");
        Thread thread_AcFun2 = new Thread(new ParameterizedThreadStart(AcFun));// ParameterizedThreadStart 委托方法的參數(shù)一定是object
        thread_AcFun2.IsBackground = true;
        thread_AcFun2.Start("object 在這里傳參數(shù)喲");
        thread_AcFun2.Join();//主線程阻塞,等待分支線程運(yùn)行結(jié)束
        Console.WriteLine();

        // 異步多線程泛型委托(有參有返回)
        Console.WriteLine("-------------------------------異步多線程泛型委托(有參有返回)--------------------------------");
        MyDelegate<string> myDelegate_BiliBili = new MyDelegate<string>(BiliBili);
        IAsyncResult iAsyncResult_BiliBili = myDelegate_BiliBili.BeginInvoke("22娘", "33娘", DateTime.Now, new AsyncCallback(BiliBili_AsyncCallback), null);
        int i = 0;
        while (!iAsyncResult_BiliBili.IsCompleted)
        {
            Console.WriteLine("沖鴨 " + i + " | 線程ID:" + Thread.CurrentThread.ManagedThreadId);
            i++;
            Thread.Sleep(1000);
        }
        //string str_BiliBili = myDelegate_BiliBili.EndInvoke(iAsyncResult_BiliBili);//獲取異步方法的返回值(此時(shí)是阻止當(dāng)前線程的,相當(dāng)于同步)
        //Console.WriteLine("return:同步 myDelegate_BiliBili={0}", str_BiliBili);
        Console.WriteLine();

        // Task異步多線程 等待所有線程運(yùn)行結(jié)束之后再執(zhí)行主線程(有參無返回)
        Console.WriteLine("-------------------------------Task異步多線程 等待所有線程運(yùn)行結(jié)束之后再執(zhí)行主線程(有參無返回)--------------------------------");
        Action<object> action = new Action<object>((object a) =>
        {
            Console.WriteLine(DateTime.Now + "入?yún)?" + a + " | 我是Action" + " | 線程ID:" + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(10000);
            Console.WriteLine(DateTime.Now + "入?yún)?" + a + " | END | 線程ID:" + Thread.CurrentThread.ManagedThreadId);
        });
        List<Task> tasks = new List<Task>();
        tasks.Add(Task.Factory.StartNew(action, "1.傳唯一的一個(gè)值在這個(gè)"));
        tasks.Add(Task.Factory.StartNew(action, "2.StartNew方法有15個(gè)重載"));
        tasks.Add(Task.Factory.StartNew(action, "3.Action只能有一個(gè)object參數(shù)或者無參,但是不能有返回值"));
        tasks.Add(Task.Factory.StartNew(action, "4.看看這5個(gè)是不是多線程"));
        tasks.Add(Task.Factory.StartNew(action, "5.看看這5個(gè)是不是全部完成之后再走主線程"));
        Task.WaitAll(tasks.ToArray());// 等待所有線程執(zhí)行完畢后執(zhí)行主線程

        Console.WriteLine();

        Console.WriteLine("故事的最后還是說了 拜");
        Console.ReadKey();

    }

    /// <summary>
    /// BiliBili 異步泛型委托
    /// </summary>
    /// <param name="result">異步委托的結(jié)果</param>
    static void BiliBili_AsyncCallback(IAsyncResult result)
    {
        Console.WriteLine("我是BiliBili_AsyncCallback");

        AsyncResult async = (AsyncResult)result;
        MyDelegate<string> DelegateInstance = (MyDelegate<string>)async.AsyncDelegate;
        string str_BiliBili = DelegateInstance.EndInvoke(result);

        Console.WriteLine("return:回調(diào)函數(shù)中 BiliBili_AsyncCallback={0}", str_BiliBili);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容