簡體   English   中英

異步運行ASP.NET Entity Framework 6存儲過程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM