-->

要使用的BeginInvoke异步调用的方法和结果保存在会话状态(To invoke a metho

2019-09-19 11:36发布

我有一个调用一个方法异步使用的BeginInvoke,我上一个WebForm按钮单击事件执行此此示例代码。

按钮点击后,用户会被重定向到一个不同的页面,当用户等待结果。

该AuthorizePayment方法需要很长的时间来运行,并返回一个INT代码。 我想在一些地方保存会话或一个cookie(而不是dispaly)当我访问会话添加的代码,它抛出空异常int值。 如何保存这个结果在一个会话或饼干吗?

任何想法?

    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.
  }
}

Answer 1:

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

一个更好的办法来做到这一点是运行在一个AJAX请求付款,并授权代码执行同步。



Answer 2:

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

在你原来的方法,你可以调用异步方法

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

  session["authorisation"] = authorizationValue;

让我知道如果你需要更具体的例子(我的VS.net坏了,所以我不得不在这里键入:()



文章来源: To invoke a method asynchronously by using BeginInvoke and save the result in Session state