Я новичок в многопоточности. У меня есть winform, у которого есть метка и индикатор выполнения.
Я хочу показать результат обработки. Во-первых, я использую метод Application.DoEvents()
. Но я нахожу, что форма замораживается.
Затем я прочитал статью о многопоточности в MSDN.
Во-вторых, я использую BackgroundWorker для этого.
this.bwForm.DoWork += (o, arg) => { DoConvert(); };
this.bwForm.RunWorkerAsync();
Форма не замерзает, что я могу перетащить/дрог при обработке. К сожалению, он вызывает исключение InvalidOperationException. Поэтому я должен использовать это. Control.CheckForIllegalCrossThreadCalls = false;
Я гарантирую, что это не окончательное решение.
Есть ли у вас какое-то предложение сделать это, эксперты?
Edit: Когда я вызываю listview throw InvalidOperationException. Этот код находится в DoWork().
foreach (ListViewItem item in this.listView1.Items)
{
//........some operation
lbFilesCount.Text = string.Format("{0} files", listView1.Items.Count);
progressBar1.Value++;
}
Edit2: Я использую делегат и вызываю в DoWork(), и он не бросает exeption. Но форма снова замерзает. Как это сделать, чтобы форма могла быть отброшена/драпируема при обработке?