Я наткнулся на какой-то код в профессиональной библиотеке и не уверен, что это чистый способ обработки вызовов потока через поток.Тематические события - это «чистый» способ?
Код приведен в приложении формы. звонки темы сделаны из класса, который сам начинает новый поток и получает сообщения:
private void Library_StatusChanged(object sender, AbstractTestCase.StatusChangedEventArgs e)
{
if (this.InvokeRequired)
{
this.lblProgress.Invoke((MethodInvoker)delegate()
{
lblProgress.Text = "Current state: " + e.Step;
lblProgress.Refresh();
}
);
this.pbProgess.Invoke((MethodInvoker)delegate()
{
pbProgess.Value = e.Percentage;
pbProgess.Refresh();
});
this.lstStatus.Invoke((MethodInvoker)delegate()
{
lstStatus.Items.Add(" " + e.Step);
lstStatus.Refresh();
});
this.Invoke((MethodInvoker)delegate()
{
this.Refresh();
});
}
else
{
lblProgress.Text = "Current state:" + e.Step;
lblProgress.Refresh();
pbProgess.Value = e.Percentage;
pbProgess.Refresh();
lstStatus.Items.Add(" " + e.Step);
lstStatus.Refresh();
this.Refresh();
}
Application.DoEvents();
}
Является ли это «состояние искусства»? По-моему, это немного грязно ?!
я обычно беру использование 'Application.DoEvents' как знак чего-то не так. И, вероятно, было бы более эффективно иметь только один «Invoke» вместо 4 отдельных. –
Библиотека является однопоточной (помимо некоторых редких многопоточных частей), и, таким образом, пользовательский интерфейс замерзает. – AllDayPiano
* "и, таким образом, пользовательский интерфейс зависает" * и 'Application.DoEvents' - это действительно дрянной способ бумаги над этой проблемой. –