Creo que Rafa tiene razon. Con hilos lo podrias hacer.
Mira este ejemplo
protected void Button1_Click(object sender, EventArgs e)
{
Thread worker = new Thread(new ParameterizedThreadStart(HeavyOperation));
worker.IsBackground = false;
worker.Start(DateTime.Now);
}
public void HeavyOperation(Object obj)
{
Thread.Sleep(10000);
File.WriteAllText("C:\\Temp.txt", String.Format("Termine la ejecucion en: {0}", (DateTime)obj));
}
Es importante lo siguiente:
worker.IsBackground = false;
Si fuera background el hilo principal moriria en cuanto la pagina devolviese el resultado y con el el hilo secundario. De esta forma el hilo principal devolvera la pagina al usuario inmediatamente pero no morira hasta que el hilo secundario termine.
public void HeavyOperation(Object obj)
Esta es la firma estandar para un delegado, es decir, tu funcion "pesada" debe se void NombreDeFuncion (Object param). Si tienes mas 1 parametro los puedes meter a todos en un array y pasar ese array.
File.WriteAllText("C:\\Temp.txt", String.Format("Termine la ejecucion en: {0}", (DateTime)obj));
Si vas a ejecutar mi ejemplo cerciorate de que el usuario asp.net tiene permisos de escritura en la ubicacion donde vas a escribir el fichero.
Dime si te funciona
Saludos