为了账号安全,请及时绑定邮箱和手机立即绑定

了解C#中的异步/等待

了解C#中的异步/等待

C#
SMILET 2019-11-12 11:05:08
我开始学习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文章对您有所帮助。
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

我开始学习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()并且永远不会结束,但是我不明白为什么。我敢肯定,我只是缺少一些简单的东西,或者只是没有正确的思维模式。


查看完整回答
反对 回复 2019-11-12
?
森栏

TA贡献1810条经验 获得超5个赞

您的任务永远不会完成,因为它们永远不会开始运行。


我将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.Delay


public 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");

}


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 594 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信