使用BeginInvoke异步调用方法并将结果保存在Session状态中

时间:2012-07-14 22:18:21

标签: c# asp.net session asynchronous begininvoke

我有这个使用begininvoke异步调用方法的示例代码,我在webform上的按钮单击事件上执行此操作。

单击按钮后,用户将被重定向到另一个页面,用户将在该页面中等待结果。

AuthorizePayment方法需要很长时间才能运行并返回一个int代码。我想在会话或cookie中的某个地方存储该int值(但不要显示)当我访问Session以添加该代码时,它会抛出null异常。如何将此结果保存在会话或cookie中?

有什么想法吗?

    public class CreditCardAuthorizationManager
{
  // Delegate, defines signature of method(s) you want to execute asynchronously
  public delegate int AuthorizeDelegate(string creditcardNumber, 
                                        DateTime expiryDate, 
                                        double amount);

  // Method to initiate the asynchronous operation
  public void StartAuthorize()
  {
      AuthorizeDelegate ad = new AuthorizeDelegate(AuthorizePayment);
      IAsyncResult ar = ad.BeginInvoke(creditcardNumber, 
                                       expiryDate, 
                                       amount,                  
                                       new AsyncCallback(AuthorizationComplete), 
                                       null);
  }

  // Method to perform a time-consuming operation (this method executes 
  // asynchronously on a thread from the thread pool)
  private int AuthorizePayment(string creditcardNumber, 
                               DateTime expiryDate, 
                               double amount)
  {
    int authorizationCode = 0;

    // Open connection to Credit Card Authorization Service ...
    // Authorize Credit Card (assigning the result to authorizationCode) ...
    // Close connection to Credit Card Authorization Service ...
    return authorizationCode;
  }

  // Method to handle completion of the asynchronous operation
  public void AuthorizationComplete(IAsyncResult ar)
  {
    // See "Managing Asynchronous Completion with the EndInvoke Method"
    // later in this chapter.
  }
}

2 个答案:

答案 0 :(得分:0)

您无法可靠地跨HTTP请求执行工作,因为ASP.NET工作进程可能会在任意时刻中止。付款可能已由提供商执行,但您的网站可能认为没有(并且付款已丢失)。我当然不希望将我的信用卡数据输入到这样的系统中。

更好的方法是在AJAX请求上运行付款并使授权代码同步执行。

答案 1 :(得分:0)

您可以使用async关键字创建一个方法并返回任务,而不是创建开始调用和使用委托。

在原始方法中,您可以将异步方法称为

 Task<int> authorizationValue = await yourAsyncMethodCall(creditcardNumber, expirydate, amount)

  session["authorisation"] = authorizationValue;

如果您需要更具体的示例,请告诉我(我的VS.net已损坏所以我必须输入此处:()