Ausführen einer asynchronen Operation, die von einer ASP.NET-Webseitenanforderung ausgelöst wird

Habe ich ein asynchroner Vorgang, der aus verschiedenen Gründen muss ausgelöst werden, die über einen HTTP-Aufruf ASP.NET web Seite. Wenn meine Seite angefordert wird, sollten Sie beginnen, diese operation und sofort wieder eine Bestätigung an den client.

Diese Methode ist auch ausgesetzt über einen WCF-service, und es funktioniert perfekt.

Bei meinem ersten Versuch, war eine Ausnahme geworfen, der mir sagt:

Asynchrone Operationen sind in diesem Kontext nicht zulässig. 
Seite starten einer asynchronen operation zu haben, die Async 
Attribut auf true festgelegt ist, und einen asynchronen Betrieb kann nur sein 
auf einer Seite gestartet, die vor PreRenderComplete-Ereignis.

Also, natürlich habe ich den Async="true" parameter der @Page Richtlinie. Nun, ich bin nicht immer ein Fehler, aber die Seite wird blockiert, bis der Asynchrone Vorgang abgeschlossen ist.

Wie bekomme ich ein true fire-and-forget-Seite arbeiten?

Edit: code für mehr info. Es ist ein bisschen komplizierter als das, aber ich habe versucht, die Allgemeine Idee, die in es.

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");
    }
}

Den AsyncMessageSender Klasse:

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
}

InformationsquelleAutor der Frage Damovisa | 2009-03-23

Schreibe einen Kommentar