最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中的Task.WaitAll和Task.WaitAny方法介紹

 更新時(shí)間:2022年04月21日 09:08:55   作者:農(nóng)碼一生  
這篇文章介紹了C#中的Task.WaitAll和Task.WaitAny方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、簡(jiǎn)介

Task.WaitAll:等待所有提供的 Task 對(duì)象完成執(zhí)行過(guò)程。

Task.WaitAny:等待提供的任一 Task 對(duì)象完成執(zhí)行過(guò)程。

二、代碼案例

Task.WaitAll

代碼:

    class Program
    {
        public class DownLoadTest
        {
            Stopwatch watch = new Stopwatch();
            public  DownLoadTest()
            {
                watch.Start();
            }
                
            public async Task DoRunTaskAsync(string url, CancellationToken ct)
            {
                if (ct.IsCancellationRequested)
                {
                    Console.WriteLine(string.Format("取消{0}的運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                    return;
                }
                Console.WriteLine(string.Format("下載{0}開(kāi)始運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                WebClient wc = new WebClient();
                await Task.Run(() =>
                {
                    var task = wc.DownloadStringTaskAsync(url);
                    while (!task.IsCompleted)
                    {
                        if (ct.IsCancellationRequested)
                        {
                            Console.WriteLine(string.Format("取消{0}的運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                            return;
                        }
                    }
                    if (task.IsCompleted)
                        Console.WriteLine(string.Format("下載{0}運(yùn)行結(jié)束 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                });
            }
        }

        static void Main(string[] args)
        {

            DownLoadTest dwtest = new DownLoadTest();
            CancellationTokenSource cts = new CancellationTokenSource();
            CancellationToken token = cts.Token;
            var task1 = dwtest.DoRunTaskAsync("https://www.baidu.com/", token);
            var task2 = dwtest.DoRunTaskAsync("https://www.taobao.com/", token);
            var task3 = dwtest.DoRunTaskAsync("https://www.cnblogs.com/", token);
            Task[] tasks = new Task[] { task1, task2, task3 };
            Console.WriteLine("task.Result等待結(jié)果打印");
            Task.WaitAll(tasks, 10000);
            cts.Cancel();//超過(guò)10s時(shí)間取消運(yùn)行
            Console.WriteLine(task1.Status);
            Console.WriteLine(task2.Status);
            Console.WriteLine(task3.Status);
            Console.WriteLine(string.Format("主線(xiàn)程運(yùn)行結(jié)束"));
            Console.ReadKey();
        }
    }

運(yùn)行結(jié)果:

通過(guò)運(yùn)行結(jié)果可以看出,可以看到Task.WaitAll(tasks)在等待超時(shí)的時(shí)間內(nèi),同步等待了所有的任務(wù)完成。

Task.WaitAny

代碼:

    class Program
    {
        public class DownLoadTest
        {
            Stopwatch watch = new Stopwatch();
            public  DownLoadTest()
            {
                watch.Start();
            }
                
            public async Task DoRunTaskAsync(string url, CancellationToken ct)
            {
                if (ct.IsCancellationRequested)
                {
                    Console.WriteLine(string.Format("取消{0}的運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                    return;
                }
                Console.WriteLine(string.Format("下載{0}開(kāi)始運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                WebClient wc = new WebClient();
                await Task.Run(() =>
                {
                    var task = wc.DownloadStringTaskAsync(url);
                    while (!task.IsCompleted)
                    {
                        if (ct.IsCancellationRequested)
                        {
                            Console.WriteLine(string.Format("取消{0}的運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                            return;
                        }
                    }
                    if (task.IsCompleted)
                        Console.WriteLine(string.Format("下載{0}運(yùn)行結(jié)束 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                });
            }
        }

        static void Main(string[] args)
        {

            DownLoadTest dwtest = new DownLoadTest();
            CancellationTokenSource cts = new CancellationTokenSource();
            CancellationToken token = cts.Token;
            var task1 = dwtest.DoRunTaskAsync("https://www.baidu.com/", token);
            var task2 = dwtest.DoRunTaskAsync("https://www.taobao.com/", token);
            var task3 = dwtest.DoRunTaskAsync("https://www.cnblogs.com/", token);
            Task[] tasks = new Task[] { task1, task2, task3 };
            Console.WriteLine("task.Result等待結(jié)果打印");
            Task.WaitAny(tasks, 4000);
            cts.Cancel();//超過(guò)4s時(shí)間取消運(yùn)行
            Console.WriteLine(task1.Status);
            Console.WriteLine(task2.Status);
            Console.WriteLine(task3.Status);
            Console.WriteLine(string.Format("主線(xiàn)程運(yùn)行結(jié)束"));
            Console.ReadKey();
        }
    }

運(yùn)行結(jié)果:

通過(guò)運(yùn)行結(jié)果截圖可以看出,可以看到,Task.WhenAny(tasks)至少等待了一個(gè)任務(wù)的完成。這里https://www.baidu.com/先下載完,就直接終止等待 。

三、總結(jié)

Task.WaitAll阻止當(dāng)前線(xiàn)程,直到所有其他任務(wù)完成執(zhí)行為止。Task.WaitAny阻止當(dāng)前線(xiàn)程,至少等待一個(gè)任務(wù)完成執(zhí)行為止。如果等待時(shí)長(zhǎng)設(shè)置較長(zhǎng),上述案例結(jié)果會(huì)一樣。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

禄丰县| 田东县| 蒙自县| 安福县| 都兰县| 侯马市| 黄平县| 突泉县| 菏泽市| 鄱阳县| 西林县| 琼海市| 海丰县| 佛山市| 诸暨市| 休宁县| 包头市| 东山县| 杭州市| 棋牌| 清河县| 霍林郭勒市| 辽阳市| 广昌县| 垣曲县| 杨浦区| 馆陶县| 临桂县| 平山县| 永州市| 宁远县| 宁陕县| 鲁山县| 沧源| 本溪| 周至县| 丹江口市| 河源市| 揭阳市| 伊宁市| 阳西县|