На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Передача e-mail частями , Асинхронный метод
    Надо передать письмо частями для отображения прогресс-бара.
    Это синхронная запись в поток NetworkStream.

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

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

    ExpandedWrap disabled
      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-й вариант:
    Пробовал сделать асинхронным методом:

    ExpandedWrap disabled
      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++;
              }


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

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

      Может я изобретаю велосипед, но если тебе нужно посчитать сколько данных отправил поток можешь наследовать класс и перепределить в нём методы write, например так

      ExpandedWrap disabled
        class s : NetworkStream
            {
                private int _SendByteCount;
         
                public s (Socket socket)
                    : base (socket)
                {
                    
                }
                public override void Write (byte[] buffer, int offset, int size)
                {
                    _SendByteCount += size;
         
                    base.Write (buffer, offset, size);
                }
                public override void WriteByte (byte value)
                {
                    _SendByteCount++;
         
                    base.WriteByte (value);
                }
         
                public int SendByteCount
                {
                    get
                    {
                        return _SendByteCount;
                    }
                }
            }
        Цитата

        А чем не устраивает стандартный смтп клиент?


        А свобода программизма где ...



        Мне надобно ПрогрессБар сделать.
        Для этого я разбил на части массив dataToWrite и сделал цикл.

        Соответсвенно использую асинхронные методы BeginWrite и EndWrite.

        Но не получается пока отследить реальную запись частей
        массива dataToWrite с использованием EndWrite.
        Сообщение отредактировано: ModulC -
          writeStream.Flush поставь после writeStream.Write
            Flush у NetworkStream вообще ничего не делает
              writeStream.Flush уже пробовал давно - проблема не в этом.

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

              Надо с помощью асинхронного метода EndWrite отследить момент реальной записи
              пакета (части массива dataToWrite).

              Вот это не получается...
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0365 ]   [ 16 queries used ]   [ Generated: 25.04.24, 02:20 GMT ]