"Недопустимая операция в нескольких потоках" как исправить данный недуг? - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, помогите пожалуйста исправить ошибку, вроде сделал с горем пополам вывод времени до конца операции распаковки архива, проверял в логах, все работало и выводило, начал выводить в лейбл - ошибка, по дефолту лейбл скрыт, раньше вывода данного текста перевожу visible в состояние true, при выводе текста в лейбл краш приложения:
An exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll but was not handled in user code
 
Additional information: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'vremya_raspakovki_label' не из того потока, в котором он был создан.
Сам код:
public void zip_ExtractProgress(object sender, ExtractProgressEventArgs e)
        {
            var zip = ZipFile.Read("Update.zip");
            switch (e.EventType)
            {
                case ZipProgressEventType.Extracting_EntryBytesWritten:
                 arhiv.Start();
                 var uje = e.BytesTransferred;
                 var vsego = e.TotalBytesToTransfer;
                 var ostalos = vsego - uje;
                 var skorost = uje / arhiv.Elapsed.TotalSeconds;
                 var vremya = ostalos / skorost;
                 TimeSpan vremya_convert = TimeSpan.FromSeconds(vremya);
                 string time_vivod = string.Format("{0:D2} ч {1:D2} мин {2:D2} с",
                    vremya_convert.Hours,
                    vremya_convert.Minutes,
                    vremya_convert.Seconds);
                 vremya_raspakovki_label.Text = String.Format("Примерное время: {0}",
                    time_vivod);
                break;
                case ZipProgressEventType.Extracting_AfterExtractEntry:
                 if (context != null)
                 context.Send((o) =>{
                 double procenti = (((double)progressBar2.Value / (double)progressBar2.Maximum) * 100);
                 label4.Text = String.Format(" Распаковка обновления... ({0}%)", 
                    procenti.ToString("0.0"));
                 progressBar2.Value = e.EntriesExtracted;
                 if(progressBar2.Value >= zip.Count) {
                    button1.Enabled = true;
                    button1.Visible = true;
                    label4.Text = "Распаковка прошла успешно.";
                 }
                },null);break;
            }
            zip.Dispose();
        }
Заранее благодарен за ответ или помощь, гуглил на эту тему, но решения не нашел...

Решение задачи: «"Недопустимая операция в нескольких потоках" как исправить данный недуг?»

textual
Листинг программы
Console.WriteLine("{0}% {1}",
                procenti.ToString("0.0"), 
                time_vivod);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5
Похожие ответы