一個作業真的要花很長的時間,再調也調不了什麼了嗎?
可以考慮改一下使用 Fire and Forget 方式。
本來介紹使用簡單的 QueueBackgroundWorkItem 。
環境 : .NET 4.5.2
最近在調整一個系統的效能,但用 SQL Profiler 去錄,每個SQL都很快,需要執行很多SQL。
所以整體來看,完成這個工作需要花費約 8 秒的時間。
後來想說將某段要執行的SQL先Hold住,整批再執行。
發現也省不了太多時間,如下,
這時發現了 .NET 4.5.2 有個 QueueBackgroundWorkItem ,似乎可以拿來運用一下。
所以就把需要長時間運行 Task 放到裡面去。
因為原本的程式就是Call WebService 所以就把 WebService 升到 .NET 4.5.2。
測試起來還蠻OK的哦! 在運行中,有手動將 Application Pool 回收,Task還是有執行。
如果有類似的問題可以考慮用看看哦!
VS.NET開發請安裝「Microsoft .NET Framework 4.5.2 Developer Pack」,
程式類似如下,
C#
Func<CancellationToken, Task> fireFun = token =>
{
int ranValue = 0;
try
{
token.ThrowIfCancellationRequested();
Thread.Sleep(3000);
var rand = new Random();
ranValue = rand.Next();
}
catch (Exception ex)
{
Console.WriteLine("處理真的發生錯誤時,要做的事");
}
return Task.FromResult(ranValue);
};
HostingEnvironment.QueueBackgroundWorkItem(fireFun);
VB.NET
Dim fireFun As Func(Of CancellationToken, Task) = Function(token As CancellationToken)
Try
token.ThrowIfCancellationRequested()
'要做的長時間Task
Return Task.FromResult("要傳出去的值")
Catch ex As Exception
'處理真的發生錯誤時,要做的事
End Try
End Function
System.Web.Hosting.HostingEnvironment.QueueBackgroundWorkItem(fireFun)
另外這種 Fire and Forget 也可以參考「Hangfire」哦!
參考資料
QueueBackgroundWorkItem to reliably schedule and run background processes in ASP.NET
Using HostingEnvironment.QueueBackgroundWorkItem to run background tasks in ASP.NET
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^