需要有关异步操作的帮助

时间:2009-04-20 16:28:51

标签: asynchronous design-patterns

我对异步和面向服务的编程比较陌生,并希望做到以下几点:

  1. 在可能运行数分钟甚至数小时的数据库中触发存储过程。
  2. 将代码返回给作业ID的调用者,客户端可以使用该代码来跟踪作业的进度。
  3. 这似乎是一项简单的任务,但对异步编码不熟悉,我担心未知的陷阱。这种功能是否有明确定义的模式?如果是这样,它是否有名称和什么是好资源?

5 个答案:

答案 0 :(得分:0)

当运行异步调用时,可以自定义设置某种回调来处理过程的结果(我不是严格地讨论存储过程,可以是任何异步调用的调用) - 这可能是结果集或只是一个成功/失败指标。

如果你周到地使用异步调用设置某种安全网来捕捉结果并以适当的方式做出反应,我看不出这种方法存在任何缺陷(这种方法实际上在许多情况下经常是必要的)

对于对存储过程进行异步调用的实际示例(.NET)(看起来与您的特定情况相关),请查看here

答案 1 :(得分:0)

如果你想以异步方式进行,你有两种主要方式:

使用您在完成时调用的任何资源注册回调函数。

如果您的资源没有此功能,请启动跟踪所有请求的线程,并定期轮询请求完成。每次任务完成时,都会通过回调通知所有者。

答案 2 :(得分:0)

在您的情况下,您需要使用回调方法。这将异步启动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?上的答案,了解以简单方式解释的所有不同类型的异步技术。

答案 3 :(得分:0)

在我提出原始问题后,这个答案已经过去了两年多,但是直到最近我才看到服务设计模式这本书时,我没有找到我特别想要的内容。

请求确认模式

http://servicedesignpatterns.com/ClientServiceInteractions/RequestAcknowledge

客户希望操纵文件或文档,启动业务任务或向系统通知有趣的事件。请求不需要立即处理。如果需要响应,则无需在处理请求后立即发送响应。

当服务收到请求时,将其转发到后台进程,然后返回包含唯一请求标识符的确认。

enter image description here

答案 4 :(得分:-1)

查看observer pattern

来自维基百科:

  

观察者模式(观察者的一个子集)   异步发布/订阅   pattern)是一种软件设计模式   其中一个对象,称为   主题,维护一份清单   家属,称为观察员,和   自动通知他们   状态变化,通常是通过调用一个   他们的方法。它主要用于   实现分布式事件处理   系统

关于观察者模式的另一篇好的MSDN文章可以找到here