Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
тоже самое Grienders - сянкс, ща гляну |