Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Асинхронная обработка данных


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

З.Ы. Надеюсь без аякса это можно сделать? Слышал о IHttpAsyncHander, но как его использовать не знаю совершенно. Заранее спасибо smile

Автор: Idsa 25.7.2007, 00:21
Как-то натолкнулся я на очень хороший http://forum.ixbt.com/topic.cgi?id=26:36828 на ixbt как раз по этой теме. В топике перечислены все способы организации асинхронных вызовов.

Для 4-го пункта там нет ссылки. Пример реализации данного подхода можно найти в http://forum.ixbt.com/topic.cgi?id=26:36842 топике того же форума.

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

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

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

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

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

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

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

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

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

Автор: Drago 26.7.2007, 11:07
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, 17:37
Сделал я то, что задумал, только вот теперь надо как нибудь избавиться от кнопки размерами 0 на 0 )) И как то извернуться вызвав метод ShowResult() с клиента... Ни у кого нет идей?

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

З.Ы. Знаю что как то можно использовать XMLHttpRequest, реализующий идею Аякс... Если кто нибудь подскажет как, буду очень благодарен smile

Автор: VirusUZ 1.2.2011, 07:28
 smile 

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