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
)使用相同的类型(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关键字,我是否可以编写完成相同任务的相同方法