当前位置: 首页 > 编程语言 > C#

从Windows窗体异步执行一个存储过程然后断开连接?分享

时间:2023-04-10 13:27:04 C#

从Windows窗体异步执行存储过程然后断开连接?我正在从我的应用程序调用一个存储过程,它最多可能需要30分钟才能执行。我不希望我的用户在整个时间段内都打开该应用程序。所以我想调用存储过程,让它飞起来,让他们关闭应用程序然后回来。我怎样才能做到这一点?这其实是一种很常见的情况。您不能做任何基于客户端的事情,因为客户端可能会离开并断开连接,您将失去到目前为止所做的工作。解决方案是使用ServiceBrokerActivation:您在数据库中创建服务并附加激活的过程。在您的应用程序(或ASP页面)中,您向服务发送一条消息并为您的过程嵌入必要的参数。该消息在提交申请时激活服务进程。服务过程从消息中读取参数并调用您的过程。这是可靠的,因为激活发生在与原始连接无关的服务器线程上。事实上,服务器甚至可以在进程执行过程中关闭并重启,工作会回滚再恢复,因为激活消息会在重启后再次触发服务进程。更新我已经发布了有关如何执行此操作的详细信息,包括我博客上的示例代码:异步进程执行。您可以使用SqlCommand的BeginExecuteXXX/EndExecuteXXX方法(取决于它是否返回结果),传递一个回调委托。如果你真的想完全关闭你的应用程序,我建议你在SQLServerAgent中定义一个作业,然后只需执行一条T-SQL语句即可手动启动该作业。语法是:sp_start_job{[@job_name=]'job_name'|[@job_id=]job_id}[,[@error_flag=]error_flag][,[@server_name=]'server_name'][,[@step_name=]'step_name'][,[@output_flag=]output_flag]这个作业将执行你的存储过程。您必须有点创意才能传递任何参数。例如,将参数插入“队列”表并让作业处理队列中的所有行。在队列中插入触发器也应该工作,而不是作业。我建议重新架构。创建一个“工作队列”表,您可以在其中记录运行存储过程的请求。然后要么有一个Windows服务或一个SQLServer作业,它会不时检查工作队列(或者非常聪明并使用触发器)来启动存储过程。让存储过程时不时地更新工作队列表中的进度,你的前端可以看看告诉用户进度,完成后显示结果。我更喜欢使用后台服务进行离线处理,用户应用程序告诉服务做什么,然后断开连接。该服务可以记录经过的时间和错误/状态,并在必要时重新启动。WCF就是为此而设计的,并支持与之通信的队列。让他们关闭应用程序,稍后再回来如果您想让他们完全关闭应用程序,则必须启动一个单独的.exe或其他ThreadPool中的其他内容来执行调用存储过程的代码。否则,您的线程将在您关闭应用程序时终止。另一种方法是让应用程序在后台运行(可能在通知区域),然后退出或在作业完成时收到通知。您可以将它与BeginExecuteNonQuery和EndExecuteNonQuery方法一起使用,以允许它在单独的线程中运行。您的应用程序的主窗口不需要打开。如果您将它作为工作线程启动,只要IsBackground==false,它就会一直运行。我通常喜欢通过SQLServer代理或作为客户端-服务器应用程序来完成这些事情(没有什么可以阻止在同一台机器上运行的客户端-服务器应用程序,甚至是相同的二进制文件)。好久不见...以上是C#学习教程:从WindowsForms异步执行一个存储过程然后断开连接?所有分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——usingSystem.Threading;.....线程_t=null;voidStartProcedure(){_t=newThread(newThreadStart(this.StartProc));_t.IsBackground=false;//如果我没记错的话,这是默认值。_t.开始();}boolProcedureIsRunning{得到{返回_t.IsRunning;}//可能是IsActive。不记得了。}voidStartProc(objectparam){//你的逻辑在这里..也可以作为匿名方法来完成。打破它以保持简单。}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: