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


Автор: sindi8 24.1.2006, 17:45
Доброго времени суток. Видел ли кто-нибудь что-то подобное? Есть основная форма. Есть данные, которые нужно выгрузить в веб-сервис. При выгрузке данных открывается форма (показываю ее методом 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;
}

}

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

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

Автор: sindi8 27.1.2006, 13:49
Хм, а это мысль! smile
Попробую.

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

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


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

Автор: sindi8 30.1.2006, 17:41
По всей вероятности это очередная дыра в .NET (а именно 1.1 с накатанным сверху сервис-паком). Подобный эффект наблюдается при работе с диалоговыми окнами независимо от выполняемых действий. Во всяком случае провел подобный эксперимент со своими проектами (разными) - везде такая хрень происходит. Пора все-таки переползать видимо на второй дотнет.

Автор: arilou 30.1.2006, 17:47
sindi8
Ты не мог бы выложить код для тестирования? Интересно самому посмотреть.

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

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

Появляется дочерняя форма (главная форма становится недоступной и ждет результат диалога). После этого открываю диспетчер файлов, кликаю правой кнопкой по названию исполняемого файла, посылаю ему команду свернуть - все, после восстановления диалоговое окно исчезло, в Label значение DialogResult=Cancel. Т.е. получается что при сворачивании для дочернего окна посылается команда Close.
ЗЫ: хотел выложить архив проекта - не нашел как это сделать.

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

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

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

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

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

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

Точно, task manager, я описАлся. У меня WinXP SP2, VS.NET 2003, .NET 1.1.4322 SP1.
Что ж - в железке значит проблема что ли? Вот же блин подстава!

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

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

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

Автор: Leksey 17.4.2006, 22:00
А что такое асинхронный поток?
 

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

Автор: vinegr 17.5.2006, 10:24
Ой, а у меня и во второй версии та же фигня
(2003 Server SP1, .Net Framework V 2.0.50727)
и ведь я на это нарывался, да только так и не понял - в чем дело  smile 
Будут какие-нить результаты - поделитесь, плиз 

Автор: arilou 17.5.2006, 12:01
vinegr, код в студию. В тестовом проекте воспроизводится? 

Автор: vinegr 2.6.2006, 13:33
да, в тестовом примере от arilou та же фигня 

Автор: arilou 3.6.2006, 10:35
Цитата(vinegr @  2.6.2006,  13:33 Найти цитируемый пост)
да, в тестовом примере от arilou та же фигня  

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

Добавлено @ 10:50 
Вот обещанный пример без ShowDialog, работающий похоже. 

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