我有一个异步操作,由于多种原因需要使用ASP.NET web页面的HTTP调用来触发。当请求我的页面时,它应该启动此操作并立即向客户端返回确认。
这个方法也通过WCF Web服务公开,而且它运行得非常完美。
在我第一次尝试时,抛出了一个异常,告诉我:
在这个上下文中不允许异步操作。 启动异步操作的页面必须设置Async属性为true, 异步操作只能在PreRenderComplete事件之前的页面上启动。
所以我当然在@Page
指令中添加了Async="true"
参数。现在,我没有收到错误消息,但是页面会阻塞,直到异步操作完成。
如何才能实现真正的“点火并忘记”页面?
编辑:一些代码提供更多信息。它比这要复杂一些,但我已经尽量在其中表达了基本思想。
public partial class SendMessagePage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string message = Request.QueryString["Message"];
string clientId = Request.QueryString["ClientId"];
AsyncMessageSender sender = new AsyncMessageSender(clientId, message);
sender.Start();
Response.Write("Success");
}
}
AsyncMessageSender类:
public class AsyncMessageSender
{
private BackgroundWorker backgroundWorker;
private string client;
private string msg;
public AsyncMessageSender(string clientId, string message)
{
this.client = clientId;
this.msg = message;
// setup background thread to listen
backgroundThread = new BackgroundWorker();
backgroundThread.WorkerSupportsCancellation = true;
backgroundThread.DoWork += new DoWorkEventHandler(backgroundThread_DoWork);
}
public void Start()
{
backgroundThread.RunWorkerAsync();
}
...
// after that it's pretty predictable
}