【发布时间】:2018-10-01 03:29:08
【问题描述】:
我需要一些关于正确使用 await 的规则。在 .net core c# 7.2 中运行此代码:
static class Program
{
static async Task<string> GetTaskAsync(int timeout)
{
Console.WriteLine("Task Thread: " + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(timeout);
return timeout.ToString();
}
static async Task Main()
{
Console.WriteLine("Main Thread: " + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("Should be greater than 5000");
await Watch(NotParallel);
Console.WriteLine("Should be less than 5000");
await Watch(Parallel);
}
public static async Task Parallel()
{
var res1 = GetTaskAsync(2000);
var res2 = GetTaskAsync(3000);
Console.WriteLine("result: " + await res1 + await res2);
}
public static async Task NotParallel()
{
var res1 = await GetTaskAsync(2000);
var res2 = await GetTaskAsync(3000);
Console.WriteLine("result: " + res1 + res2);
}
private static async Task Watch(Func<Task> func) {
var sw = new Stopwatch();
sw.Start();
await func?.Invoke();
sw.Stop();
Console.WriteLine("Elapsed: " + sw.ElapsedMilliseconds);
Console.WriteLine("---------------");
}
}
正如大家所见,两种方法的行为是不同的。在实践中很容易出错。所以我需要一个“拇指规则”。
真人更新请运行代码。请解释为什么 Parallel() 比 NonParallel() 运行得更快。
【问题讨论】:
-
你的问题到底是什么?
-
已更新........
-
您是否正在寻找类似“如果一个依赖于另一个,则仅按顺序等待任务”之类的东西?目前还不清楚问题是什么。
-
juharr - 这似乎是一个很好的解释。请将其移至答案中
-
您要求什么“经验法则”?
Task是如果你await可能会产生结果的东西。在那之前,它只是一个什么都不做的对象。在您的NonParallel方法中,您甚至没有第二个任务,直到第一个任务完成,所以这些方法当然是完全不同的。
标签: c# multithreading asynchronous c#-7.2