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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача MAIL частями, запись в поток 
:(
    Опции темы
Modul
Дата 10.6.2007, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Надо передать письмо частями для отображения прогресс-бара.
Это синхронная запись в поток NetworkStream.

Результат: прогресс-бар быстро пролетает, а реально для записи
письма (300 КБ) приходиться ждать еще 1 мин 15 сек.

Как сделать, чтобы прогресс-бар соответствовал реальной записи.

Код

private void current_message(string mess)
        {           

            form1.progressBar1.Maximum = n;

            // Массив dataToWrite разбит на N частей

        for (int i = 1; i <= N; i++)
            {


                if (writeStream.CanWrite)
                {
                    writeStream.Write(dataToWrite, offset, size);
                    
                    // функция для ProgressBar
                    fyncProgress(i);
                }
                
                              
            }
        }


        private delegate void Callback(int j);

        private void fyncProgress(int j)
        {
            if (form1.progressBar1.InvokeRequired)            
                form1.BeginInvoke(new Callback(fyncProgress), new object[] { j });
            
            else form1.progressBar1.Value = j;           
        }


2-й вариант
Пробовал сделать асинхронным методом:
Код

if (writeStream.CanWrite)
   {
    writeStream.BeginWrite(dataToWrite, offset, size, new AsyncCallback(myWriteCallBack), writeStream);                                       

    }

public void myWriteCallBack(IAsyncResult ar)
        {
            
            writeStream = (NetworkStream)ar.AsyncState;
            writeStream.EndWrite(ar);
            form1.progressBar1.Value = k++;
        }


Результат тот же.
Как-то надо отследить моменты записи частей на почтовый сервер.



--------------------
I'll be back !
PM MAIL   Вверх
arilou
Дата 10.6.2007, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



После writeStream.Write(dataToWrite, offset, size); попробуй поставить writeStream.Flush() т.к. поток буферизирует.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Modul
Дата 11.6.2007, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Не помогло. Время тоже.

Получается, что части письма (пакеты данных) бросаются в поток, а дальше
запись зависит от пропускной способности сети (КБ/сек) и почтового сервера.
--------------------
I'll be back !
PM MAIL   Вверх
arilou
Дата 11.6.2007, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



Modul, а! тебе надо асинхронно посылать (см. Stream.BeginWrite/EndWrite). По аналогии с этой статьей - http://www.codeproject.com/cs/internet/webdownload.asp


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Modul
Дата 11.6.2007, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Пример больно мудреный smile 

Никто не спорит - нужны асинхронные методы.

Код

if (writeStream.CanWrite)
                {
                    //writeStream.Write(dataToWrite, offset, size);

                    IAsyncResult result = writeStream.BeginWrite(dataToWrite, offset, size, null, null);
                    if (result.IsCompleted)
                        writeStream.EndWrite(result);

                    result.AsyncWaitHandle.WaitOne();
                    writeStream.EndWrite(result);

                    // Progress
                    fyncProgress(i);
                }



Везде пишут - Вызов блокируется, пока не завершится выполнение Async.
А цикл то выполняется (не блокируется).

Остальные участники куда-то спрятались. Ау...


Это сообщение отредактировал(а) Modul - 11.6.2007, 20:01
--------------------
I'll be back !
PM MAIL   Вверх
arilou
Дата 11.6.2007, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



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


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

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

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

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


 




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


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

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