2009-12-01 158 views
0

我有一個客戶端應用程序將數據擦除到一個原始表中。此客戶端應用程序對實際將原始數據分析爲表的存儲過程進行異步調用。該處理由存儲過程處理。該存儲過程可能需要長達半小時才能運行。我們希望調用存儲過程的客戶端應用程序退出並完全停止運行。只要我們終止調用存儲過程的客戶端應用程序,存儲過程就會退出執行。異步Storec Proc無需等待完成

實現這個目標的最佳方法是什麼?我不想在服務器上運行作業。我希望客戶端應用程序觸發此處理。數據庫觸發器(我的第一個想法)並沒有解決問題,因爲它沒有考慮插入完成,直到觸發器調用的存儲過程完成。

這裏是Async方法。我正在使用LINQ。我能以某種方式修改這個嗎?或者我需要一個新的設計?

partial class MetaDataContext 
{ 

    delegate int Process_CompleteCycle2Delegate(int? frequencyID, int? cycleID); 

    public void Process_CompleteCycle2Async(int? frequencyID, int? cycleID) 
    { 
     Process_CompleteCycle2Delegate completeCycleDelegate = new Process_CompleteCycle2Delegate(this.Process_CompleteCycle2); 
     IAsyncResult async = completeCycleDelegate.BeginInvoke(frequencyID, cycleID, null, null); 

} 

回答

4

請參閱Asynchronous procedure execution爲可靠和交易方式consitent的方式。

+0

完美...感謝Remus – ctrlShiftBryan 2009-12-01 20:37:02

+0

是否有任何理由爲什麼當我用你的方法調用我的存儲過程時,我得到了很多SPID互相阻塞?當我運行我的proc時,無論是通過SSMS還是通過我的應用程序,這都不會發生。 – ctrlShiftBryan 2009-12-02 21:04:29

+0

不是特別的。所需的額外對話/隊列基礎設施增加了一些鎖,但它們不應該衝突(不阻塞)。執行背景也增加了一些鎖,但是它不應該衝突。你能使用sys.dm_exec_requests來看看爭用是什麼嗎?什麼聲明互相阻塞,在什麼資源上)。如果您主張不在線,請使用我網站上的聯繫表單,並向我發送更多詳細信息。今天晚些時候我可以查看它們。 – 2009-12-02 21:27:43