2 回答

TA貢獻1810條經驗 獲得超4個贊
語法 1 和語法 2 在功能上是不同的。語法 1 不等待next()完成其Task. 語法 1 將一個普通的 lambda 函數(shù)傳遞給Use并返回Task而不等待它完成。語法2傳遞一個asynclambda函數(shù)是awaiting在Task返回之前。該await關鍵字告訴應用程序暫停執(zhí)行,直到next()任務完成。在您的示例代碼中,這可能不會導致功能差異,但有時等待 aTask完成可能會有所不同。
語法 2 和語法 3 在語法上不同,但在功能上相同。語法 2 只是語法 3 的用戶友好版本。參見Func<T>() 與 Func<T>.Invoke()
語法 1 和語法 4 在語法上不同,但在功能上相同。語法 1 只是語法 4 的用戶友好包裝。請參閱UseExtension.cs
// syntax 1,2,3 use this
public static IApplicationBuilder Use(
this IApplicationBuilder app,
Func<HttpContext, Func<Task>, Task> middleware)
{
// which calls into syntax4
return app.Use(next =>
{
return context =>
{
Func<Task> simpleNext = () => next(context);
return middleware(context, simpleNext);
};
});
}

TA貢獻1821條經驗 獲得超5個贊
語法 4 是使用Use方法IApplicationBuilder
IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware)
語法 1、2 和 3 正在使用擴展方法,IApplicationBuilder該方法是語法 4 中先前方法的包裝器。這是實現(xiàn)
public static IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpContext, Func<Task>, Task> middleware)
{
return app.Use(next =>
{
return context =>
{
Func<Task> simpleNext = () => next(context);
return middleware(context, simpleNext);
};
});
}
對于語法2和3,有沒有區(qū)別next.Invoke()和next()。它們都編譯為相同的方法。
- 2 回答
- 0 關注
- 186 瀏覽
添加回答
舉報