У меня есть асинхронная операция, которая по разным причинам должна запускаться с использованием HTTP-вызова на веб-страницу ASP.NET. Когда моя страница запрашивается, она должна начать эту операцию и немедленно вернуть подтверждение клиенту.
Этот метод также отображается через веб-службу WCF, и он отлично работает.
С моей первой попытки исключение было брошено, сказав мне:
Asynchronous operations are not allowed in this context. Page starting an asynchronous operation has to have the Async attribute set to true and an asynchronous operation can only be started on a page prior to PreRenderComplete event.
Поэтому, конечно, я добавил параметр Async="true"
в директиву @Page
. Теперь я не получаю сообщение об ошибке, но страница блокируется до завершения асинхронной операции.
Как я могу получить истинную страницу с огнем и забытью?
Изменить: Некоторый код для получения дополнительной информации. Это немного сложнее, чем это, но я попытался получить там общую идею.
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 pretty predictable
}