异步和快速路径优化
本文关键字:路径 优化 异步 | 更新日期: 2023-09-27 18:15:31
我正在对一个OWIN项目进行重构,我遇到了一些关于c#快速路径优化。
所以我读了关于预计算任务的最佳实践,使方法异步或不异步之类的东西。
更准确地说,在快速路径优化上:
基于任务的异步模式最佳实践(快速路径p9) http://www.microsoft.com/en-us/download/details.aspx?id=19957
与迭代器的指导相同,这对我来说更容易理解,因为我对TAP很陌生http://social.msdn.microsoft.com/forums/en - us/d9146792 - 1 - b9a - 4807 a42e - 29107 - c281cc4/can -等待- taskfromresult介绍concurrency?forum=async
下面是我遇到的代码:
public class CustomMiddleware2 : OwinMiddleware
{
public override async Task Invoke(IOwinContext context)
{
await InvokeInternal(context);
}
private Task InvokeInternal(IOwinContext context)
{
if (Wacko.WhatDOuKnow)
{
context.Response.Redirect("/awesomeurl");
//fast path
return Task.FromResult<object>(null);
}
return Next.Invoke(context);
}
public CustomMiddleware2(OwinMiddleware next)
: base(next)
{
}
}
,这是我实际打算做的替换:
public class BetterOrNotMiddleware : OwinMiddleware
{
public override Task Invoke(IOwinContext context)
{
if (Wacko.WhatDOuKnow)
{
context.Response.Redirect("/awesomeurl");
//fast path
return Task.FromResult<object>(null);
}
else
return InvokeInternal(context);
}
private async Task InvokeInternal(IOwinContext context)
{
await Next.Invoke(context);
}
public BetterOrNotMiddleware(OwinMiddleware next)
: base(next)
{
}
}
问题是,没有太大的差别。我不确定BetterOrNotMiddleware类是更优化还是更合适?我觉得等下一班比较合适。调用调用,代码可能会更容易理解,因为这与使用迭代器处理异常的模式相同(上面的链接)
我可能错过了一些关于异步状态机或调用堆栈的东西,这些东西可以验证第二种方法,但是我对异步太陌生了,无法获得它。
但如果这一切只是一个微优化,我不确定我想要费心改变应用程序中的所有中间件。好吧,尽管如此
这些几乎完全相同。这两个选项之间没有真正的区别,除了不需要进行第二次方法调用(无论如何编译器可以对其进行优化)。
你可以只用一个方法来做所有的事情:
public class BetterOrNotMiddleware : OwinMiddleware
{
private static readonly Task CompletedTask = Task.FromResult<object>(null);
public override Task Invoke(IOwinContext context)
{
if (Wacko.WhatDOuKnow)
{
context.Response.Redirect("/awesomeurl");
// fast path
return CompletedTask;
}
else
{
return Next.Invoke(context);
}
}
// ...
}
编辑:实际上没有理由每次都创建一个新任务,所以我使用一个静态完成的任务来代替。
在第一个代码示例中,为什么要等待呢?
public override Task Invoke(IOwinContext context)
{
return InvokeInternal(context);
}
第二个代码示例也是如此,您可以使两个示例完全快速路径,因此它们几乎完全相同。
InvokeInternal
方法对我来说似乎毫无意义,只需将逻辑直接放在Invoke
中,即
public override Task Invoke(IOwinContext context)
{
if (Wacko.WhatDOuKnow)
{
context.Response.Redirect("/awesomeurl");
return Task.FromResult<object>(null);
}
return Next.Invoke(context);
}