为什么分配任务然后等待它允许并行 运行
Why does assigning a Task then awaiting it allow to run in parallel
我一直在玩异步,我遇到了一些我以前没有注意到的行为,如果这是重复的请告诉我,但是我的 google-fu 失败了,主要是因为我想不出合适的搜索词:
给定一个执行一些参数化工作的简单异步方法:
async Task<String> Foo(int i)
{
await Task.Delay(i);
return i.ToString();
}
以及在不同上下文中调用它并捆绑结果的调用方法:
async Task<Object> Bar()
{
var one = Foo(3000);
var two = Foo(5000);
var three = Foo(3000);
var x =
new
{
One = await one,
Two = await two,
Three = await three,
};
return x;
}
这在 5 秒内完成(在 Linqpad6、.NET Core 3.1 中)。所以我假设每个任务同时运行。
但是,如果我将其更改为在开始时等待,它会在 11 秒内完成。所以我假设每个任务按顺序运行。
async Task<Object> Bar()
{
var one = await Foo(3000);
var two = await Foo(5000);
var three = await Foo(3000);
var x =
new
{
One = one,
Two = two,
Three = three,
};
return x;
}
我的问题是,分配任务然后等待它与仅等待允许他们并行完成的任务有什么区别?
查看行内评论
async Task<Object> Bar()
{
var one = Foo(3000); // <-- It can Start
var two = Foo(5000); // <-- It can Start
var three = Foo(3000); // <-- It can Start
var x =
new
{
One = await one, // <-- you are waiting for it to finish
Two = await two, // <-- you are waiting for it to finish
Three = await three,// <-- you are waiting for it to finish
};
return x;
}
async Task<Object> Bar()
{
var one = await Foo(3000); // <-- you are waiting for it to finish
var two = await Foo(5000); // <-- you are waiting for it to finish
var three = await Foo(3000); // <-- you are waiting for it to finish
var x =
new
{
One = one,
Two = two,
Three = three,
};
return x;
}
我一直在玩异步,我遇到了一些我以前没有注意到的行为,如果这是重复的请告诉我,但是我的 google-fu 失败了,主要是因为我想不出合适的搜索词:
给定一个执行一些参数化工作的简单异步方法:
async Task<String> Foo(int i)
{
await Task.Delay(i);
return i.ToString();
}
以及在不同上下文中调用它并捆绑结果的调用方法:
async Task<Object> Bar()
{
var one = Foo(3000);
var two = Foo(5000);
var three = Foo(3000);
var x =
new
{
One = await one,
Two = await two,
Three = await three,
};
return x;
}
这在 5 秒内完成(在 Linqpad6、.NET Core 3.1 中)。所以我假设每个任务同时运行。
但是,如果我将其更改为在开始时等待,它会在 11 秒内完成。所以我假设每个任务按顺序运行。
async Task<Object> Bar()
{
var one = await Foo(3000);
var two = await Foo(5000);
var three = await Foo(3000);
var x =
new
{
One = one,
Two = two,
Three = three,
};
return x;
}
我的问题是,分配任务然后等待它与仅等待允许他们并行完成的任务有什么区别?
查看行内评论
async Task<Object> Bar()
{
var one = Foo(3000); // <-- It can Start
var two = Foo(5000); // <-- It can Start
var three = Foo(3000); // <-- It can Start
var x =
new
{
One = await one, // <-- you are waiting for it to finish
Two = await two, // <-- you are waiting for it to finish
Three = await three,// <-- you are waiting for it to finish
};
return x;
}
async Task<Object> Bar()
{
var one = await Foo(3000); // <-- you are waiting for it to finish
var two = await Foo(5000); // <-- you are waiting for it to finish
var three = await Foo(3000); // <-- you are waiting for it to finish
var x =
new
{
One = one,
Two = two,
Three = three,
};
return x;
}