Если InvokeRequired имеет значение false, вам вообще не нужно беспокоиться о вызове чего-либо — вы уже находитесь в правильном потоке.
Лучшее решение может быть примерно таким:
public delegate void InvokerDelegate(string data);
public void DoStuff(string data){
login_submit.Text = data;
}
а затем при вызове выполните:
if (InvokeRequired){
Invoke(InvokerDelegate(DoStuff), "something");
}
else{
DoStuff("Something");
}
Довольно распространенный шаблон, который вы увидите, заключается в том, чтобы сделать что-то подобное для функций, которые управляют графическим интерфейсом в многопоточной среде.
public delegate void InvokerDelegate();
public void DoGuiStuff(){
if (login_submit.InvokeRequired){
login_submit.Invoke(InvokerDelegate(DoGuiStuff));
return;
}
login_submit.Text = "Some value";
}
Если вы используете приведенный выше шаблон, функция проверяет, требуется ли вызов, и если да, то вызывает себя в правильном потоке. Затем он возвращается. Когда он вызывает сам себя, проверка того, требуется ли вызов, возвращает false, поэтому он не беспокоится о повторном вызове самого себя - он просто запускает код.
Редактировать: я только что вернулся к winforms и попытался использовать этот шаблон только для того, чтобы потратить пару разочаровывающих минут, пытаясь понять, почему я не могу вызвать лямбду. Я подумал, что мне лучше вернуться и обновить этот ответ, чтобы добавить необходимое приведение на случай, если кто-то еще попытается его использовать.
person
Russell Troywest
schedule
24.04.2011