Мне показалось, что я понял, что для того, чтобы отдельный поток вносил изменения в графический интерфейс в приложении winforms, необходимо вызвать метод. Тем не менее, я написал метод для асинхронного заполнения combobox, и это показывает мне, что в истории больше.При каких условиях необходимо вызывать метод?
Вот соответствующий код, с информацией компании опущена:
private List<string> ids = new List<string>();
private BindingSource bindingSource = new BindingSource();
//...
cboIds.DataSource = bindingSource;
private void GetAvailableIds()
{
Task idTask = new Task(
() =>
{
bindingSource.Add("Searching..."); //This always updates the UI
//without invoking
if (cboIds.InvokeRequired)
{
Invoke((MethodInvoker)delegate
{ //This sometimes updates the UI without
cboIds.Enabled = false; //invoking, but sometimes fails, so I
}); //added the check
}
else
cboIds.Enabled = false;
List<string> temp = GetUpcomingIds();
Invoke((MethodInvoker)delegate
{
cboIds.Enabled = true;
bindingSource.Clear();
foreach (string str in temp)
bindingSource.Add(str); //This never works without invoking.
}); //Why, if the same operation above
}); //always works without invoking?
idTask.Start();
}
Почему это, что начальное дополнение к BindingSource не нуждается в Invoke, установив combobox.enabled ложь иногда нуждается в Invoke , и окончательные добавления к BindingSource всегда нужно вызвать? Если они все в одной и той же ветке, не должны ли они вести себя одинаково? Неужели я ошибаюсь в своем предположении, что все они в одной теме?
Когда вы получаете доступ к форме управления winform, поток, который не создал элемент управления, который вам нужно вызвать. – dotctor
'Задача' <>' Thread'. –
Так вот проблема, которую я вижу здесь из-за использования задачи, а не Thread? – charlieparker