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