Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.174.174] |
|
Сообщ.
#1
,
|
|
|
Надо передать письмо частями для отображения прогресс-бара.
Это синхронная запись в поток 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++; } Результат тот же. Как-то надо отследить моменты записи частей на почтовый сервер. Везде пишут - Вызов блокируется, пока не завершится выполнение Async. А цикл то выполняется (не блокируется). |
Сообщ.
#2
,
|
|
|
А чем не устраивает стандартный смтп клиент?
Может я изобретаю велосипед, но если тебе нужно посчитать сколько данных отправил поток можешь наследовать класс и перепределить в нём методы write, например так 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; } } } |
Сообщ.
#3
,
|
|
|
Цитата А чем не устраивает стандартный смтп клиент? А свобода программизма где ... Мне надобно ПрогрессБар сделать. Для этого я разбил на части массив dataToWrite и сделал цикл. Соответсвенно использую асинхронные методы BeginWrite и EndWrite. Но не получается пока отследить реальную запись частей массива dataToWrite с использованием EndWrite. |
Сообщ.
#4
,
|
|
|
writeStream.Flush поставь после writeStream.Write
|
Сообщ.
#5
,
|
|
|
Flush у NetworkStream вообще ничего не делает
|
Сообщ.
#6
,
|
|
|
writeStream.Flush уже пробовал давно - проблема не в этом.
Части письма (пакеты данных) бросаются в поток, а дальше запись зависит от пропускной способности сети (КБ/сек) и почтового сервера. Надо с помощью асинхронного метода EndWrite отследить момент реальной записи пакета (части массива dataToWrite). Вот это не получается... |