【发布时间】:2012-07-14 22:18:20
【问题描述】:
我有这个使用 begininvoke 异步调用方法的示例代码,我在 web 表单上的按钮单击事件上执行它。
点击按钮后,用户被重定向到另一个页面,用户在此等待结果。
AuthorizePayment 方法需要很长时间才能运行并返回一个 int 代码。我想将该 int 值存储在会话或 cookie 中的某处(但不显示)当我访问 Session 以添加该代码时,它会引发空异常。如何将此结果保存在会话或 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.
}
}
【问题讨论】:
-
需要更多信息才能了解您无法访问会话的原因。这些是
aspx页面吗?目标页面如何“等待”响应,您是否从脚本中轮询某些内容?我一般同意@usr,您应该使用ajax 而不是从aspx 代码隐藏启动线程(如果这是您正在做的事情)但是这里有很多关于架构的缺失信息,以了解可能出现的问题。 -
@jamietre 这是真实场景。真实场景是在登录我的应用程序时从第三方供应商处获取令牌。我不希望我的用户等待第三方供应商返回令牌(以防供应商系统运行缓慢)。拥有这个令牌是件好事,但不是强制性的。如果我们有令牌,它将在整个应用程序中使用,而不是在一页中。
-
@jamietre 只有当我将 HttpContext.Current 传递给委托时,我才能访问会话。我只是担心,因为这个委托可以超过页面请求的生命周期,以及分配给该页面请求的 HttpContext 对象的有效生命周期。
-
我想我明白了 - 你是说你将
HttpContext传递给你的后台线程并且当你以后尝试从该线程访问它时它不再可用(例如 null)?从未尝试过,但很有意义。使用另一种机制在后台线程和活动会话之间共享此信息,例如尝试传递当前HttpContext的Cache属性-缓存是全局的,并且未绑定到特定的上下文,因此我认为对它的引用不应随上下文而死。如果这不起作用,那么直接进入数据库?
标签: c# asp.net session asynchronous begininvoke