Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Передача MAIL частями


Автор: Modul 10.6.2007, 20:09
Надо передать письмо частями для отображения прогресс-бара.
Это синхронная запись в поток 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++;
        }


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



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

Автор: Modul 11.6.2007, 06:57
Не помогло. Время тоже.

Получается, что части письма (пакеты данных) бросаются в поток, а дальше
запись зависит от пропускной способности сети (КБ/сек) и почтового сервера.

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

Автор: Modul 11.6.2007, 20:00
Пример больно мудреный 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.
А цикл то выполняется (не блокируется).

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

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

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