Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > .NET: Web приложения > Выполнение долгих операций


Автор: Stereon 25.11.07, 14:20
Здраствуйте уважаемые форумчане.
У меня следующий вопрос:
на странице должно выполнить долгое действие, например вызов какого либо сервиса
есть два минуса
1. занятость потока, т.е. масштабируемость падает
2. Клиент долго ждёт пока к нему вернётся страница

1. Решаемо с помощью Async = "true" и вызовом AddOnPreRenderCompleteAsync.
2. Решение 1 не подходит так как фокус не возвращается потоку ASP, а соответственено юзер ждёт.

Думаю можно сделать, что многопоточность, но боюсь вдруг хостер жто дело запретит,
или можно сдлеать через Ajax, после закрвузки страницы отписать что типа выполняется,
и через Ajax вызвать на сервера выполнение этой долгой операции, и потм просто спрашивать
через интервал времени о выполненности.

Подскажите какое из решений будет правильней не хотел бы изобретать велосипед быть может
существуют более изящные и безопастные способы.

Заранее благодарен за помощ!!!

Автор: UncleBob 25.11.07, 14:27
Цитата Stereon @
и через Ajax вызвать на сервера выполнение этой долгой операции, и потм просто спрашивать
через интервал времени о выполненности.

В этом случае все равно без потока не обойтись.

Если делать через AJAX, то поток не нужен. Просто идет асинхронный запрос на сервер, и пока он выполняется, на сайте индикатор. Если хочешь прогресс - то это по-любому поток.

Автор: Stereon 25.11.07, 14:32
А как насчёт разрешения запускат поток на хостере?
+ если запустить новый поток в PageLoad через Thread, то этот поток будет не из пула АСП,
а если вызвать [AjaxMethod] по средствам аджакса потом после загрузки у клиента,
этот запрос уже будет работать и создан будет из потока пула АСП.

Автор: UncleBob 25.11.07, 15:03
Я к сожалению, не в курсе что есть [AjaxMethod]. В ASP.NET AJAX, который я использую, AJAX-запросы обслуживаются в том же потоке, что и обычные.

Автор: Stereon 25.11.07, 15:08
Цитата Uncle_Bob @
Я к сожалению, не в курсе что есть [AjaxMethod]. В ASP.NET AJAX, который я использую, AJAX-запросы обслуживаются в том же потоке, что и обычные.

В старом Аджаксе не в Атласе так обозначают методы в классе которые могут быть вызваны с клиента асинхронно.

Автор: UncleBob 25.11.07, 15:10
Есть еще BackgroundWorker, который по идее работает в том же пуле... Насчет new Thread не могу ничего сказать, не разбирался пока... Хотя использовал, работало и ладно :)

В новом аяксе ничего не надо такого указывать... <_<

Автор: Stereon 26.11.07, 13:33
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
                Ajax.Utility.RegisterTypeForAjax(typeof(ajax), this.Page);
     
            Master.Page.ClientScript.RegisterClientScriptBlock(Master.Page.GetType(),
                  "func",
                  @"function CheckIndex()
                    {  
                       document.getElementById('ctl00_ContentPlaceHolder1_Message_lb').value = '1';
                       var response          = ajax.Payed();  
                       var t = response.value;
                  
                      if ( t != null )
                      {
                         document.getElementById('ctl00_ContentPlaceHolder1_Message_lb').innerHTML = t;    
                      }
                   }", true);
     
            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork+=new DoWorkEventHandler(DoWork);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted);
            bw.RunWorkerAsync();
     
            Master.Page.ClientScript.RegisterStartupScript(Master.Page.GetType(), "timer", "window.setInterval (CheckIndex, 3000);", true);
        }
     
     
        void DoWork(object sender, DoWorkEventArgs e)
        {
            System.Threading.Thread.Sleep(1000);
        }
     
        void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            HttpContext.Current.Session.Add("mykey", "Готово!!!");
        }


Страница не загружается пока не выполниться DoWork.

гуру подскажите же что делать :-)

Автор: UncleBob 26.11.07, 17:31
А new Thread?

Автор: GRIENDERS 26.11.07, 17:43
Stereon, на aspnetmania.com есть статья "Ожидание выполнения длительного процесса в ASP.NET"

Автор: Stereon 27.11.07, 06:29
Цитата Uncle_Bob @
А new Thread?

тоже самое

Grienders - сянкс, ща гляну

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)