[英]Run ASP.NET Entity Framework 6 stored procedure asynchronously
我正在嘗試構建一個頁面,該頁面允許用戶啟動存儲過程,然后繼續使用網站的其余部分,而不必等待該過程完成。
我曾嘗試為此調用創建后台工作線程和輔助EDMX,但是當前該站點在代碼運行時仍然沒有響應(通常需要一到兩分鍾)。
protected void SaveReversal_Click(object sender, EventArgs e)
{
if (PeriodList.SelectedValue != "")
{
var bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(AsyncReverseDataload_DoWork);
bw.WorkerReportsProgress = false;
bw.WorkerSupportsCancellation = false;
bw.RunWorkerAsync(Convert.ToInt32(PeriodList.SelectedValue));
}
}
private void AsyncReverseDataload_DoWork(object sender, DoWorkEventArgs e)
{
int TrackerDetailKey = (int)e.Argument;
using (AsyncEntities ar = new AsyncEntities())
{
IObjectContextAdapter dbcontextadapter = (IObjectContextAdapter)ar;
dbcontextadapter.ObjectContext.CommandTimeout = 600;
try
{
var results = ar.ReverseDataload(TrackerDetailKey);
}
catch (Exception ex)
{
Console.Write(ex.ToString());
}
}
}
我如何使它實際運行,以便站點在開始執行存儲過程后仍能對用戶做出響應?
因為您說可能要花費一到兩分鍾的時間,所以您處於“失火忘卻”的境地(我認為是這樣)。
以下是一些選項:
-ThreadPool使用Task.Run,Task.Factory.StartNew等。但是,我真的認為這是一個壞主意! IIS / ASP.NET必須回收該應用程序。 如果在進行回收時后台線程正在運行,則該工作將丟失。
-QueueBackgroundWorkItem,如果您的任務最多需要30秒,請使用它
-IRegisteredObject是后台工作者+最后的機會
第三方庫“ HangFire” Nito.AspNetBackgroundTasks包,請檢查github頁面如何使用它。
-調用頁面范圍之外的方法,該方法來自asmx / wcf,可能嵌入在項目中。
除了所有這些,我會尋求一個可靠的解決方案
-控制台應用程序或
-Service,可以從WebApp直接在“任務隊列”中添加任務,然后從那里安全地執行日志和必要的邏輯。
希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.