Expectation of performance of long process in ASP.NET
We admit{allow}, we have page Default.aspx on which the user enters a name of the client and number{room} of the waybill then there is a check of this number{room}. As check can borrow{occupy} long time it is necessary to provide the user with the information on a course of performance of process (goes or has already passed). The simplest way is resulted below.
Default
using System;
using System. Data;
using System. Configuration;
using System. Collections;
using System. Web;
using System. Web. Security;
using System. Web. UI;
using System. Web. UI.WebControls;
using System. Web. UI.WebControls. WebParts;
using System. Web. UI.HtmlControls;
using System. Threading;
public partial class _Default: System. Web. UI.Page
{
protected Guid _id;
protected void Page_Load (object sender, EventArgs e)
{
if (Page. IsPostBack)
{
_id = Guid. NewGuid ();
ThreadStart ts = new ThreadStart (Check);
Thread th = new Thread (ts);
th. Start ();
Response. Redirect (" Invoice.aspx? ID = " + _id. ToString ());
}
}
protected void Check ()
{
string res = InvoiceProcessor. CheckInvoice (txtName. Text, txtNumber. Text);
CheckedInvoices. Add (_id, res);
}
}
Essence in that the unique identifier is created. On which the result will be received from the khehsh-table of results. An example of a class of table CheckedInvoices and a class - zaglushki which in the normal application carries out check InvoiceProcessor, are resulted below.
CheckedInvoices
using System;
using System. Collections;
public static class CheckedInvoices
{
private static Hashtable _invoices = new Hashtable ();
public static string GetResult (Guid id)
{
if (_invoices. Contains (id))
{
return Convert. ToString (_invoices [id]);
}
else
{
return " ";
}
}
public static void Add (Guid id, string value)
{
_invoices [id] = value;
}
public static void Remove (Guid id)
{
_invoices. Remove (id);
}
}
InvoiceProcessor
using System;
using System. Threading;
public static class InvoiceProcessor
{
public static string CheckInvoice (string customerName, string invoiceID)
{
Thread. Sleep (10000);
if (invoiceID == "qwerty")
{
return " the Current status: it is transferred{handed} to service dostavkinOzhidaemoe time of delivery: the devil only knows ";
}
else if (invoiceID == "asdfgh")
{
return " the Current status: dostavlenonOzhidaemoe time of delivery: so already ";
}
else
{
return " there Is no information under the given waybill ";
}
}
}
The page on which readdressing is carried out, should check readiness of result only.
Invoice
using System;
using System. Data;
using System. Configuration;
using System. Collections;
using System. Web;
using System. Web. Security;
using System. Web. UI;
using System. Web. UI.WebControls;
using System. Web. UI.WebControls. WebParts;
using System. Web. UI.HtmlControls;
public partial class Invoice: System. Web. UI.Page
{
protected void Page_Load (object sender, EventArgs e)
{
if (Request. Params ["ID"]! = null)
{
Guid id = new Guid (Request. Params ["ID"]);
if (CheckedInvoices. GetResult (id) .Length == 0)
{
phInvoice. Controls. Add (new LiteralControl (" Please, wait... "));
Response. AddHeader ("Refresh", "5");
}
else
{
phInvoice. Controls. Add (new LiteralControl (CheckedInvoices. GetResult (id)));
CheckedInvoices. Remove (id);
}
}
else
{
phInvoice. Controls. Add (new LiteralControl (" the identifier of the waybill is not specified. "));
}
}
}
The circuit is very simple - on page Default.aspx occurs postbehk, during this moment the new unique identifier which is passed a method, vypolnjaemumo in separate process is created. After that there is a readdressing on page Invoice.aspx where there is a check on identifikutoru (peredanomu in GET search) in table CheckedInvoices, whether there are no there data. If the data no, the heading, informing is sent a browser about necessity to make Refresh if the result has appeared to the user the result is deduced, and a key udaljaesja from the khehsh-table as it is not necessary any more.

|