[ASP.NET]好用的 HostingEnvironment.QueueBackgroundWorkItem

一個作業真的要花很長的時間,再調也調不了什麼了嗎?
可以考慮改一下使用 Fire and Forget 方式。
本來介紹使用簡單的 QueueBackgroundWorkItem 。

環境 : .NET 4.5.2

最近在調整一個系統的效能,但用 SQL Profiler 去錄,每個SQL都很快,需要執行很多SQL。

所以整體來看,完成這個工作需要花費約 8 秒的時間。

image

 

後來想說將某段要執行的SQL先Hold住,整批再執行。

發現也省不了太多時間,如下,

image

 

這時發現了 .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」,

image

 

程式類似如下,

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

.NET SDKs and Downloads

Hangfire

在ASP.NET应用中执行后台任务