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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> неожиданно гасится асинхронный поток, при сворачивании приложения 
:(
    Опции темы
sindi8
Дата 24.1.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

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



Доброго времени суток. Видел ли кто-нибудь что-то подобное? Есть основная форма. Есть данные, которые нужно выгрузить в веб-сервис. При выгрузке данных открывается форма (показываю ее методом ShowDialog), в которой отображается прогрес-бар и прогнозируемый остаток времени до завершения выгрузки. Выгрузка запускается в асинхронном потоке. Все бы хорошо, да только когда я в таск-менеджере делаю для приложения свернуть - асинхронный поток гасится! Ума не приложу в какую сторону думать! Вот примерный код, если он будет полезен:
Код

public class ExportData : System.Windows.Forms.Form
{
...
delegate void StartExportDelegate();
delegate void UniversalDelegateString(string s);
delegate void UniversalDelegateInt(int i);
...
private void ExportData_Load(object sender, System.EventArgs e)
{
    StartExportDelegate startExport = new StartExportDelegate(StartExport);
    startExport.BeginInvoke(null, null);
}

public void StartExport()
{
    fileSource;
    int result=0; //результат выгрузки файла. 0 - файл выгружается. 1 - файл выгружен. -1 - ошибка при выгрузке файла
    int partLen=524288; //размер передаваемого куска
    int sentPart=0; //переданный объем файла
    FileStream fs = new FileStream(fileSource, FileMode.Open, FileAccess.Read, FileShare.Read, partLen); //Выгрузку осуществляем по 512Kb
    int fileSize=(int)fs.Length; //размер файла в байтах
    long time=DateTime.Now.Ticks;
    int i=0; //передаваемая часть
    do
    {
        i++;
        int calcPartLen; //Размер передаваемого куска.
        if (fileSize-sentPart>=partLen)
            calcPartLen=partLen;
        else
            calcPartLen=fileSize-sentPart;
        byte[] videoByte=new byte[calcPartLen];
        fs.Read(videoByte, 0, calcPartLen);
        localhost1.Service1 video = new localhost1.Service1();
        sentPart=video.UploadFile(videoByte, filePath, fileSize);
        if (sentPart<=0)
            result=-1; //ошибка при передаче файла
        if (fileSize==sentPart)
            result=1; //файл успешно передан
        double deltaTime=(double)(DateTime.Now.Ticks-time)/i/10000000; //Время, затраченное на выполнение операции
        //Отображение прогресбара
        UniversalDelegateInt miProgress = new UniversalDelegateInt(ProgressBarShow);
        progressBar1.Invoke(miProgress, new object[] {(int)Math.Round((double)sentPart*100/fileSize)});
        //Отображение времени до завершения операции выгрузки данных
        UniversalDelegateString miLabel = new UniversalDelegateString(LabelShow);
        label2.Invoke(miLabel, new object[] {"(до завершения осталось "+Math.Round((double)(fileSize-sentPart)/calcPartLen*deltaTime)+" секунд)"});
    } while (result==0);
    if (result==1)
        this.DialogResult=DialogResult.OK;
    else
        this.DialogResult=DialogResult.Cancel;
}

private void LabelShow(string s)
{
    label2.Text=s;
}

private void ProgressBarShow(int counter)
{
    progressBar1.Value=counter;
}

}


Это сообщение отредактировал(а) sindi8 - 24.1.2006, 17:47
PM MAIL   Вверх
arilou
Дата 27.1.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Ну давай разбираться. Будем пользоваться методом уменьшения энтропии системы smile (шутка)

Ты пробовал сделать тестовый пример - выбросить из проги реальную логику и оставить только фичи дотнета (делегаты, потоки, etc) ?


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

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



Хм, а это мысль! smile
Попробую.
PM MAIL   Вверх
arilou
Дата 27.1.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(sindi8 @ 27.1.2006, 13:49 Найти цитируемый пост)

Хм, а это мысль


Я думаю, что поток падает из-за какого-то исключения. В таком случае сообщение об ошибке может не проявляться. Как вариант - поставь try catch внутри StartExport() и в catch пиши экспешп в Trace. Помогает иногда.


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

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



По всей вероятности это очередная дыра в .NET (а именно 1.1 с накатанным сверху сервис-паком). Подобный эффект наблюдается при работе с диалоговыми окнами независимо от выполняемых действий. Во всяком случае провел подобный эксперимент со своими проектами (разными) - везде такая хрень происходит. Пора все-таки переползать видимо на второй дотнет.
PM MAIL   Вверх
arilou
Дата 30.1.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



sindi8
Ты не мог бы выложить код для тестирования? Интересно самому посмотреть.


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

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



Да на самом деле все элементарно. Создаю новый поект (соответственно главную форма Form1), кидаю на форму кнопку и Label (для вывода DialogResult), создаю дочернюю форму Form2. Далее для кнопки на OnClick пишу:
Код

Form2 frm = new Form2();
frm.ShowDialog();

Появляется дочерняя форма (главная форма становится недоступной и ждет результат диалога). После этого открываю диспетчер файлов, кликаю правой кнопкой по названию исполняемого файла, посылаю ему команду свернуть - все, после восстановления диалоговое окно исчезло, в Label значение DialogResult=Cancel. Т.е. получается что при сворачивании для дочернего окна посылается команда Close.
ЗЫ: хотел выложить архив проекта - не нашел как это сделать.
PM MAIL   Вверх
arilou
Дата 1.2.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Нифига, у меня такого не наблюдается... Тока не понял, что значит
Цитата(sindi8 @ 31.1.2006, 11:44 Найти цитируемый пост)

После этого открываю диспетчер файлов, кликаю правой кнопкой по названию исполняемого файла, посылаю ему команду свернуть

Ты имеешь ввиду task manager?

Тестил на WinXP SP2, VS.NET 2003. У тебя какая винда?


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

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



Цитата(arilou @ 1.2.2006, 16:50 Найти цитируемый пост)

Ты имеешь ввиду task manager?

Точно, task manager, я описАлся. У меня WinXP SP2, VS.NET 2003, .NET 1.1.4322 SP1.
Что ж - в железке значит проблема что ли? Вот же блин подстава!
PM MAIL   Вверх
arilou
Дата 2.2.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(sindi8 @ 1.2.2006, 17:55 Найти цитируемый пост)

в железке значит проблема что ли?

Ну не так категорично smile В аттаче мой тестовый проект, попробуй у себя.

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  FormTest.zip 24,63 Kb


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


Опытный
**


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

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



А что такое асинхронный поток?
 
PM MAIL   Вверх
arilou
Дата 17.4.2006, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Leksey, а зачем поднимать такой старый топик вопросом, не относящимся к сути дела? тем более с явным намеком... 


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


Новичок



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

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



Ой, а у меня и во второй версии та же фигня
(2003 Server SP1, .Net Framework V 2.0.50727)
и ведь я на это нарывался, да только так и не понял - в чем дело  smile 
Будут какие-нить результаты - поделитесь, плиз 
PM MAIL   Вверх
arilou
Дата 17.5.2006, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



vinegr, код в студию. В тестовом проекте воспроизводится? 


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


Новичок



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

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



да, в тестовом примере от arilou та же фигня 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

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

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

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


 




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


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

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