我有一个通用处理程序(.ashx)页面,它接收来自潜在客户提供程序的XML文档。然后,我将该XML文档发送给第三方进行承保。我等待第三方的回复,然后我将该回复传递给主要提供商。所有这些都发生在30秒或更短时间内。
我的问题是,在关闭连接并继续前进之前,潜在客户提供商只会等待最多30秒。我正在尝试启动一个内部计时器,如果我没有收到第三方承销商的回复,无论如何都要向主要提供商发送回复。一切正常。
我想要做的是将回复发送回主要提供商,但继续等待第三方承销商的回复。他们会把它交给我们......但有时可能需要几分钟。
我尝试过各种各样的
组合Response.Flush();
Response.Close();
Response.End();
context.ApplicationInstance.CompleteRequest();
所有我要做的就是a)抛出一个关于线程被中止的错误,或者“无法评估表达式,因为代码已经优化或者本机框架位于调用堆栈之上。”或者b )客户认为请求刚刚终止,而且从未收到回复。
我无法在不重写大部分逻辑的情况下实现队列类型架构,即便如此我也不想这样做,因为它会增加响应的处理时间。
有什么建议吗?似乎.Close()和.End()并不意味着我认为它们的作用,我无法弄清楚应该使用什么。
答案 0 :(得分:3)
也许System.Threading.ThreadPool.QueueUserWorkitem()可以帮到你?
这个想法是对线程池中线程空闲时运行的操作进行排队。
public class Data {
public int ID {get; set; }
public string OtherData { get; set; }
}
public override void ProcessRequest(HttpContext context)
{
var workLoad = new Data {
ID = int.Parse(context.Request.Params["ID"]),
OtherData = context.Request.Params["OtherData"]
};
// somewhere before the end :
ThreadPool.QueueUserWorkItem(new WaitCallback(LongRunningMethod), workLoad);
Response.Flush();
Response.Close();
}
public void LongRunningMethod(object state)
{
var data = (Data)state;
CalculateTheOriginOfTheLife(data.ID, data.OtherData);
}