我有这个使用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.
}
}
答案 0 :(得分:0)
您无法可靠地跨HTTP请求执行工作,因为ASP.NET工作进程可能会在任意时刻中止。付款可能已由提供商执行,但您的网站可能认为没有(并且付款已丢失)。我当然不希望将我的信用卡数据输入到这样的系统中。
更好的方法是在AJAX请求上运行付款并使授权代码同步执行。
答案 1 :(得分:0)
您可以使用async关键字创建一个方法并返回任务,而不是创建开始调用和使用委托。
在原始方法中,您可以将异步方法称为
Task<int> authorizationValue = await yourAsyncMethodCall(creditcardNumber, expirydate, amount)
session["authorisation"] = authorizationValue;
如果您需要更具体的示例,请告诉我(我的VS.net已损坏所以我必须输入此处:()