Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Асинхронная обработка данных 
V
    Опции темы
Drago
Дата 24.7.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 11.12.2006
Где: Тула

Репутация: нет
Всего: нет



Всем привет! Ребят, меня интересует такой ламерский вопрос.
Клиент вводит данные, отправляет их на сервер, после чего на сервере идет их долгая обработка. На каждом этапе обработки создается событие о его завершении. При наступлении данного события хотелось бы выводить клиенту данные и продолжать обработку. Помогите плиз, желательно с разъяснениями...

З.Ы. Надеюсь без аякса это можно сделать? Слышал о IHttpAsyncHander, но как его использовать не знаю совершенно. Заранее спасибо smile
PM MAIL ICQ   Вверх
Idsa
Дата 25.7.2007, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Как-то натолкнулся я на очень хороший топик на ixbt как раз по этой теме. В топике перечислены все способы организации асинхронных вызовов.

Для 4-го пункта там нет ссылки. Пример реализации данного подхода можно найти в этом топике того же форума.

Это сообщение отредактировал(а) Idsa - 25.7.2007, 01:10


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Mymik
Дата 25.7.2007, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 50
Всего: 78



Idsa, по сути это все сторона одной монеты :о(.

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

Если не использовать AJAX, то мне очень даже понравилась реализация с подгрузкой данных как в виде js файла. Т.е. тебе надо будет в этом JS файле генерировать скрипт с данными что ты хочешь отобразить. И все это повесить на setInterval (JS функция) и радоваться жизни... 


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
Idsa
Дата 25.7.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(Mymik @  25.7.2007,  08:27 Найти цитируемый пост)
Idsa, по сути это все сторона одной монеты :о(.

Я бы так не сказал.
По крайней мере там можно выделить 2 метода: 1. с использованием фреймворка AJAX 2. использование стандартных средств JS.

P. S. Метод с подгрузкой JS мне тоже очень понравился.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Drago
Дата 25.7.2007, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 11.12.2006
Где: Тула

Репутация: нет
Всего: нет



Забил я на вывод промежуточных результатов пользователю. Сделал асинхронную страницу, которая считает в фоне, а результат выводит в конце обработки. На ИИС все работало отлично, как только залил на сервер, сразу получил ошибку (там юникс стоит). Дело в том что моно не знает директиву Async, поэтому пришлось все переделывать.
Сейчас у меня появилась идея выделить метод, который обрабатывает данные, в отдельный поток. По завершении обработки так же выкидывается событие, которое перехватывается другим методом, меняющим глобальную переменную CompleteTask на true. На форму добавил кнопку, по клику на которой вызывается метод выводящий результат обработки, если CompleteTask = true. А на клиенте есть яваскрипт, который эту самую кнопочку и кликает каждые 10 секунд. Тока вот не работает нифига ))) Но это я еще завтра посмотрю, может событие не перехватывается.
Во настрочил smile
Народ как думаете работать то будет? Может как то проще можно извернутся... 
PM MAIL ICQ   Вверх
Idsa
Дата 25.7.2007, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



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

P. S. Может, все-таки внимательно ознакомишься с предложенным материалом?! В том топике указаны все возможные способы организации асинхронных вызовов. Вряд у тебя получится придумать новый.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Drago
Дата 26.7.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 11.12.2006
Где: Тула

Репутация: нет
Всего: нет



Idsa ты меня немного не так понял smile Вот смотри как я сделал
Код

public partial class _Default : Page 

    protected void Page_Load(object sender, EventArgs e) {
    }

    protected void Go_Click(object sender, EventArgs e) {
        //подготавливаем данные для обработки
    //...
    //запускаем функцию обработки в отдельном потоке
        Thread thrd = new Thread(new ThreadStart(Run));
        thrd.Start();    
    }
    
    private void DrawRaws(Context task) {
        //заносим результаты выполнения в таблицу
    }    
    
    public void ShowResult(object Sender, EventArgs arg) {
        if ((string)Session["TaskCompleted"] != "true") { //если обработка не закончена то ничего не делаем
            return;
        } else {
        // если обработка закончена то выводим результат пользователю
            }
        }
    }
    
    //перехватываем событие завершения обработки
    public void CompleteTask(object Sender, TaskEventArgs arg) {
        Session["TaskCompleted"] = "true";
    }
}

Т.е. на странице у пользователя лежат 2 кнопки. Одна из них вызывает Go_Click(), после чего начинается обработка данных в отдельном потоке, у пользователя выводится "Идет обработка". Вторая же кнопка вызывает ShowResult(). Я хочу ее сделать скрытой и с помощью JavaScript имитировать клик каждые 10 секунд. Я наверное извращенец, но пока еще не знаю как вызывать метод ShowResult() из JavaScript так же каждые 10 секунд... Понимая, что использование скрытых кнопок не хорошо smile буду искать как вызвать серверный метод с клиента. Вот такой я извращенец  smile 

З.Ы. Все необходимые переменные запихнул в сессию smile

Это сообщение отредактировал(а) Drago - 26.7.2007, 11:09
PM MAIL ICQ   Вверх
Drago
Дата 26.7.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 11.12.2006
Где: Тула

Репутация: нет
Всего: нет



Сделал я то, что задумал, только вот теперь надо как нибудь избавиться от кнопки размерами 0 на 0 )) И как то извернуться вызвав метод ShowResult() с клиента... Ни у кого нет идей?
PM MAIL ICQ   Вверх
Drago
  Дата 27.7.2007, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 11.12.2006
Где: Тула

Репутация: нет
Всего: нет



Сделал на клиенте скрипт вызывающий form.submit() и вызываю его каждые 10 секунд. А на пэйдж лоад поставил вывод данных, если обработка закончена. Чем плох такой подход и есть ли альтернатива?

З.Ы. Знаю что как то можно использовать XMLHttpRequest, реализующий идею Аякс... Если кто нибудь подскажет как, буду очень благодарен smile
PM MAIL ICQ   Вверх
VirusUZ
  Дата 1.2.2011, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 9.4.2010
Где: Узбекистан, Навои й обл.

Репутация: нет
Всего: -2



 smile 
--------------------
Virus
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.0995 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.