나는 별도의 스레드가 winforms 응용 프로그램에서 GUI를 변경하기 위해 메서드를 호출해야한다는 것을 이해했다고 생각했습니다. 그러나, 나는 비동기 적으로 콤보 박스를 채우는 방법을 썼다. 그리고 그것은 이야기에 더 많은 것이 있음을 보여준다.어떤 조건에서 메소드를 호출해야합니까?
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에 대한 초기 추가는 때때로 호출을 필요로 false로 combobox.enabled 설정, 인보을 필요로하지 않습니다 그 것이다 : 여기
은 생략 회사 정보와 관련 코드입니다 , BindingSource의 마지막 추가는 항상 호출되어야합니다. 그들은 모두 같은 스레드에 있다면, 그들은 같은 행동을해서는 안됩니다? 나는 그들이 모두 같은 스레드에 있다는 나의 가정에서 틀렸는가?
winform 컨트롤에 액세스 할 때 호출해야하는 컨트롤을 만들지 못한 스레드 양식을 만듭니다. – dotctor
'Task' <>'Thread'. –
스레드가 아닌 작업을 사용하므로 여기에서 보는 문제는 무엇입니까? – charlieparker