了解C#中的异步/等待

我开始学习C#5.0中的异步/等待,但我一点也不了解。我不明白如何将其用于并行性。我尝试了以下非常基本的程序:


using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

using System.Text;

using System.Threading;

using System.Threading.Tasks;


namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            Task task1 = Task1();

            Task task2 = Task2();


            Task.WaitAll(task1, task2);


            Debug.WriteLine("Finished main method");

        }


        public static async Task Task1()

        {

            await new Task(() => Thread.Sleep(TimeSpan.FromSeconds(5)));

            Debug.WriteLine("Finished Task1");

        }


        public static async Task Task2()

        {

            await new Task(() => Thread.Sleep(TimeSpan.FromSeconds(10)));

            Debug.WriteLine("Finished Task2");

        }


    }

}

该程序只是阻止调用,Task.WaitAll()并且永远不会结束,但是我不明白为什么。我敢肯定,我只是缺少一些简单的东西,或者只是没有正确的思维模式,而且没有任何博客或MSDN文章对您有所帮助。


SMILET
浏览 601回答 3
3回答

九州编程

我开始学习C#5.0中的异步/等待,但我一点也不了解。我不明白如何将其用于并行性。我尝试了以下非常基本的程序:using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            Task task1 = Task1();            Task task2 = Task2();            Task.WaitAll(task1, task2);            Debug.WriteLine("Finished main method");        }        public static async Task Task1()        {            await new Task(() => Thread.Sleep(TimeSpan.FromSeconds(5)));            Debug.WriteLine("Finished Task1");        }        public static async Task Task2()        {            await new Task(() => Thread.Sleep(TimeSpan.FromSeconds(10)));            Debug.WriteLine("Finished Task2");        }    }}该程序只是阻止调用,Task.WaitAll()并且永远不会结束,但是我不明白为什么。我敢肯定,我只是缺少一些简单的东西,或者只是没有正确的思维模式。

森栏

您的任务永远不会完成,因为它们永远不会开始运行。我将Task.Factory.StartNew创建一个任务并启动它。public static async Task Task1(){  await Task.Factory.StartNew(() => Thread.Sleep(TimeSpan.FromSeconds(5)));  Debug.WriteLine("Finished Task1");}public static async Task Task2(){  await Task.Factory.StartNew(() => Thread.Sleep(TimeSpan.FromSeconds(10)));  Debug.WriteLine("Finished Task2");}附带说明一下,如果您实际上只是想在异步方法中暂停,则无需阻塞整个线程,只需使用 Task.Delaypublic static async Task Task1(){  await Task.Delay(TimeSpan.FromSeconds(5));  Debug.WriteLine("Finished Task1");}public static async Task Task2(){  await Task.Delay(TimeSpan.FromSeconds(10));  Debug.WriteLine("Finished Task2");}
打开App,查看更多内容
随时随地看视频慕课网APP