2009-12-01 206 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