На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Выполнение долгих операций , ASP.NET
    Здраствуйте уважаемые форумчане.
    У меня следующий вопрос:
    на странице должно выполнить долгое действие, например вызов какого либо сервиса
    есть два минуса
    1. занятость потока, т.е. масштабируемость падает
    2. Клиент долго ждёт пока к нему вернётся страница

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

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

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

    Заранее благодарен за помощ!!!
      Цитата Stereon @
      и через Ajax вызвать на сервера выполнение этой долгой операции, и потм просто спрашивать
      через интервал времени о выполненности.

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

      Если делать через AJAX, то поток не нужен. Просто идет асинхронный запрос на сервер, и пока он выполняется, на сайте индикатор. Если хочешь прогресс - то это по-любому поток.
        А как насчёт разрешения запускат поток на хостере?
        + если запустить новый поток в PageLoad через Thread, то этот поток будет не из пула АСП,
        а если вызвать [AjaxMethod] по средствам аджакса потом после загрузки у клиента,
        этот запрос уже будет работать и создан будет из потока пула АСП.
          Я к сожалению, не в курсе что есть [AjaxMethod]. В ASP.NET AJAX, который я использую, AJAX-запросы обслуживаются в том же потоке, что и обычные.
            Цитата Uncle_Bob @
            Я к сожалению, не в курсе что есть [AjaxMethod]. В ASP.NET AJAX, который я использую, AJAX-запросы обслуживаются в том же потоке, что и обычные.

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

              В новом аяксе ничего не надо такого указывать... <_<
                ExpandedWrap disabled
                      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.

                гуру подскажите же что делать :-)
                  А new Thread?
                    Stereon, на aspnetmania.com есть статья "Ожидание выполнения длительного процесса в ASP.NET"
                      Цитата Uncle_Bob @
                      А new Thread?

                      тоже самое

                      Grienders - сянкс, ща гляну
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0258 ]   [ 17 queries used ]   [ Generated: 26.04.24, 20:15 GMT ]