【发布时间】:2011-12-29 11:50:46
【问题描述】:
我对异步和面向服务的编程比较陌生,想要做以下事情:
- 在数据库中启动一个可能运行几分钟甚至几小时的存储过程。
- 将代码返回给作业 ID 的调用者,客户端可以使用该代码来跟踪作业的进度。
这似乎是一项简单的任务,但对于异步编码来说,我很担心未知的陷阱。这种类型的功能是否有明确定义的模式?如果有,它有名字吗?什么是好的资源?
【问题讨论】:
标签: asynchronous design-patterns
我对异步和面向服务的编程比较陌生,想要做以下事情:
这似乎是一项简单的任务,但对于异步编码来说,我很担心未知的陷阱。这种类型的功能是否有明确定义的模式?如果有,它有名字吗?什么是好的资源?
【问题讨论】:
标签: asynchronous design-patterns
当运行异步调用是很好的自定义设置某种回调来处理过程的结果(我不是严格谈论存储过程,可以是任何异步调用的调用) - 这可能是一个结果集或只是一个成功/失败指示器。
如果您周到地使用异步调用设置某种安全网来捕捉结果并以适当的方式做出反应,我看不出这种方法有任何缺陷(这种方法实际上在许多情况下通常是必要的) .
有关异步调用存储过程的实际示例 (.NET)(这似乎与您的特定情况相关),请查看 here。
【讨论】:
如果您想异步执行此操作,您有两种主要方式:
使用您正在使用的任何资源注册一个回调函数,该函数将在完成时调用。
或
如果您的资源没有此类功能,请启动一个线程来跟踪所有请求并定期轮询请求的完成情况。每次任务完成时,通过回调通知所有者。
【讨论】:
在您的情况下,您需要使用回调方法。这将异步触发 sql SP 执行,并在执行完成时通知您的代码。此外,您可以使用 AsynResult 对象来轮询操作是否已完成。
回调方法参考链接SqlCommand..::.BeginExecuteReader Method (AsyncCallback, Object)。
如果你也需要轮询,可以在 IAsyncResult 上进行轮询:
// Make the asynchronous call
IAsyncResult result = command.BeginExecuteReader(callback, command);
// Poll to see if complete
while (!result.IsCompleted)
{
// Do more work here if the call isn't complete
Thread.Sleep(100);
}
请参阅我在What is AsyncCallback? 上的回答,了解以简单方式解释的所有不同类型的异步技术。
【讨论】:
这个答案是在我提出最初的问题 2 年多之后才出现的,但直到最近,当我遇到《服务设计模式》一书时,我才找到我特别要寻找的东西。
请求确认模式
http://servicedesignpatterns.com/ClientServiceInteractions/RequestAcknowledge
客户想要操作文件或文档、启动业务任务或通知系统有关有趣的事件。不需要立即处理请求。如果需要响应,则无需在处理请求后立即交付。
当服务收到请求时,将其转发到后台进程,然后返回包含唯一请求标识符的确认。
【讨论】:
来自维基百科:
观察者模式(观察者模式的一个子集) 异步发布/订阅 模式)是一种软件设计模式 其中一个物体,称为 主题,维护其列表 依赖者,称为观察者,以及 自动通知他们任何 状态改变,通常通过调用一个 他们的方法。它主要用于 实现分布式事件处理 系统。
另一篇关于观察者模式的优秀 MSDN 文章可以在 here 找到。
【讨论】: