我想知道如果我在代码中过度使用async
和await
,是否会存在(性能)惩罚?
我经常这样做:
static void Main()
{
var result = Task<int>.Run (()=> S1Async(1)).Result;
Console.WriteLine(result);
}
static async Task<int> WrapperAsync(Func<int, Task<int>> func) => await func(2);
static async Task<int> S1Async(int x) => await WrapperAsync(async t=> await S2Async(x * t));
static async Task<int> S2Async(int x) => await WrapperAsync(async t=> await S3Async(x * t));
static async Task<int> S3Async(int x) => await WrapperAsync(async t=> await S4Async(x * t));
static async Task<int> S4Async(int x) => await Task.FromResult(x * 10);
我认为可以跳过使用async-await,并且这段代码是类似的:
static void Main()
{
var result = Task<int>.Run(() => S1Async(1)).Result;
Console.WriteLine(result);
}
static Task<int> WrapperAsync(Func<int, Task<int>> func) => func(2);
static Task<int> S1Async(int x) => WrapperAsync(t => S2Async(x * t));
static Task<int> S2Async(int x) => WrapperAsync(t => S3Async(x * t));
static Task<int> S3Async(int x) => WrapperAsync(t => S4Async(x * t));
static Task<int> S4Async(int x) => Task.FromResult(x * 10);
当任务嵌套且每个级别只有一个任务时,是否可以安全地跳过async/await?
两个代码示例在LinqPad中给出相同的结果,因此我认为它们是相似的,但也许有一些副作用需要注意吗?
Result
或者Wait
)。如果使用不正确,这种做法可能会导致死锁。如果不使用async-await而是返回一个Task也是可以的,只要你不在try块中这样做,因为如果你没有等待(await),那么异常可能会在你离开try块之后抛出。 - juharr