C# C语言中的async/Wait和Task/Wait是否相同?

C# C语言中的async/Wait和Task/Wait是否相同?,c#,task,async-await,C#,Task,Async Await,我学会了使用任务比异步/等待更容易。现在,我正在尝试使用任务学习异步/等待 static void Main(string[] args) { Console.ReadKey(true); //Magic1(); Magic2(); Console.WriteLine("{0}", DateTime.Now.ToString()); Console.ReadKey(true); }

我学会了使用
任务
异步
/
等待
更容易。现在,我正在尝试使用
任务
学习
异步
/
等待

    static void Main(string[] args)
    {
        Console.ReadKey(true);
        //Magic1(); 
        Magic2();
        Console.WriteLine("{0}", DateTime.Now.ToString());
        Console.ReadKey(true);
    }

    static async void Magic1()
    {
        var taskA = GetDataAsync();
        var taskB = GetDataAsync();
        var taskC = GetDataAsync();

        Console.WriteLine("a: " + await taskA);
        Console.WriteLine("b: " + await taskB);
        Console.WriteLine("c: " + await taskC);
    }

    static Task Magic2()
    {
        return Task.Run(() =>
        {
            var taskA = GetDataAsync();
            var taskB = GetDataAsync();
            var taskC = GetDataAsync();

            Task.WaitAll(new Task[] { taskA, taskB, taskC });

            Console.WriteLine("a: " + taskA.Result);
            Console.WriteLine("b: " + taskB.Result);
            Console.WriteLine("c: " + taskC.Result);
        });
    }

    static Task<string> GetDataAsync()
    {
        return Task.Run(() => 
        {
            var startTime = DateTime.Now;
            for (var i = 0; i < 1000000000; i++)
            {
            }
            var endTime = DateTime.Now;
            return startTime.ToString() + " to " + endTime.ToString() + " is " + (endTime - startTime).ToString();
        });
    }
static void Main(字符串[]args)
{
Console.ReadKey(true);
//Magic1();
Magic2();
WriteLine(“{0}”,DateTime.Now.ToString());
Console.ReadKey(true);
}
静态异步void Magic1()
{
var taskA=GetDataAsync();
var taskB=GetDataAsync();
var taskC=GetDataAsync();
控制台.WriteLine(“a:+wait taskA”);
控制台.WriteLine(“b:+wait taskB”);
控制台.WriteLine(“c:+wait taskC”);
}
静态任务Magic2()
{
返回任务。运行(()=>
{
var taskA=GetDataAsync();
var taskB=GetDataAsync();
var taskC=GetDataAsync();
Task.WaitAll(新任务[]{taskA,taskB,taskC});
Console.WriteLine(“a:+taskA.Result”);
Console.WriteLine(“b:+taskB.Result”);
Console.WriteLine(“c:+taskC.Result”);
});
}
静态任务GetDataAsync()
{
返回任务。运行(()=>
{
var startTime=DateTime.Now;
对于(变量i=0;i<100000000;i++)
{
}
var endTime=DateTime.Now;
将startTime.ToString()+”返回到“+endTime.ToString()+”是“+(endTime-startTime.ToString()”;
});
}
我创建了两种方法,它们似乎做了同样的事情,我的问题是:

1) 发动机罩下的
Magic1
Magic2
是否相同


2) 如果它们不相同,我是否可以将
Magic1
转换为不使用
async
wait
关键字而执行相同操作的方法?

这两种方法之间的差异:

  • 他们的代码运行的地方。Magic2将在线程池上运行,而不是在调用方的同步上下文中运行,因为您(不必要地)使用了Task.run。如果您正在编写UI代码,这可能会导致Magic2失败
  • 阻塞。Magic1会阻止调用方,直到调用完成。在编写异步代码时,这通常是一个错误。Magic2不会阻止调用方,即使您删除了Task.Run
  • 增量工作。如果taskB需要更长的时间才能完成,那么这不会延迟Magic2打印taskA的结果。Magic1会等待这三个任务全部完成,因此直到taskB完成后才会打印taskA

两种方法的区别:

  • 他们的代码运行的地方。Magic2将在线程池上运行,而不是在调用方的同步上下文中运行,因为您(不必要地)使用了Task.run。如果您正在编写UI代码,这可能会导致Magic2失败
  • 阻塞。Magic1会阻止调用方,直到调用完成。在编写异步代码时,这通常是一个错误。Magic2不会阻止调用方,即使您删除了Task.Run
  • 增量工作。如果taskB需要更长的时间才能完成,这不会延迟Magic2打印taskA的结果。Magic1会等待这三个任务全部完成,因此直到taskB完成后才会打印taskA
现在,我正在尝试使用我在任务中的知识来学习async/await

我真的建议你不要这样做。尽管基于任务的并行(.NET 4.0)和基于任务的异步模式(
async
/
await
)使用相同的类型(
task
),但它们完全不同。他们解决不同的问题,有不同的工作方式

相反,我建议你假装对
任务
类型一无所知,然后从我的开始。在我的
async
intro的末尾,有几个后续资源,包括MSDN文档,它们非常适合此功能

如果您非常熟悉continuations,您可以(大部分)将
await
理解为“将此方法的其余部分重写为continuation,并使用当前
SynchronizationContext
TaskScheduler
对其进行调度”。但即便如此,这也只是一个近似值;有很多边缘案例。这与执行
任务完全不同。在
任务中等待[all]
。运行

现在,我正在尝试使用我在任务中的知识来学习async/await

我真的建议你不要这样做。尽管基于任务的并行(.NET 4.0)和基于任务的异步模式(
async
/
await
)使用相同的类型(
task
),但它们完全不同。他们解决不同的问题,有不同的工作方式

相反,我建议你假装对
任务
类型一无所知,然后从我的开始。在我的
async
intro的末尾,有几个后续资源,包括MSDN文档,它们非常适合此功能


如果您非常熟悉continuations,您可以(大部分)将
await
理解为“将此方法的其余部分重写为continuation,并使用当前
SynchronizationContext
TaskScheduler
对其进行调度”。但即便如此,这也只是一个近似值;有很多边缘案例。这与执行
任务完全不同。在
任务中等待[all]
。运行

我不完全清楚你的意思“我可以将Magic1`转换为使用Task的方法吗。你能详细解释一下吗?对不起,我的意思是不使用async和Wait关键字,我能写同样的方法来做同样的事情吗?啊,我明白了,更新了我的答案我不完全确定你的意思“我可以将Magic1`转换为使用Task的方法吗。你能详细说明一下吗?对不起,我的意思是不使用async和Wait关键字,我是否可以编写完成相同任务的相同方法