2014年12月12日 星期五

不要在 ASP.NET MVC 5 中,在 ActionFilterAttribute 上使用 Task.Factory.StartNew

今天在調整校能的時候,想到可以使用非同步的方式來增加網站的校能。

就拿 Log 來試試身手好了。

MVC 5 的ActionFilterAttribute 尚不支援非同步

真的是這樣,見 ActionFilterAttribute, 果然沒有像 WebAPI 上的 ActionFilterAttributeOnActionExecutedAsync 方法。

怎麼辦呢?

異相天開地找了一段如下的程式 (https://aspnetwebstack.codeplex.com/discussions/478983),既然被標為解答,大概就可以運作了吧!

Task.Factory.StartNew(() => Logger.WriteLogAsync(log),
				TaskCreationOptions.LongRunning);

想法是:自己使用多執行緒的方式寫 log.

結果還不錯,而且單頁測試時,效能還快了將近10%呢?

上線前效能測試

想說單頁沒問題,應該就沒問題了呢?於是就送出去測試來。

這個效能測試是正式的首頁,測個10分鐘,效能變差也就算了,竟然還會出現 502 Bad GetWays?然後網站就掛了。

結論

ASP.NET MVC 5 的ActionFilterAttribute 不支援 async/await,看來是有道理的。

印象中,ASP.NET 有這個規定:不要在頁面中自己產生新的執行緒。我不信邪,就只能撞撞牆,練練經驗了。

不要自己找麻煩。

Share with Facebook