Если 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");
}
Довольно распространенный шаблон, который вы увидите, это сделатьчто-то вроде этого для функций, которые манипулируют GUI в многопоточной среде
public delegate void InvokerDelegate();
public void DoGuiStuff(){
if (login_submit.InvokeRequired){
login_submit.Invoke(InvokerDelegate(DoGuiStuff));
return;
}
login_submit.Text = "Some value";
}
Если вы используете вышеприведенный шаблон, функция проверяет, требуется ли вызов, и если так, то вызывает себя в нужном потоке.Затем он возвращается.Когда он вызывает себя, проверка того, требуется ли вызов, возвращает false, поэтому он не беспокоится о повторном вызове самого себя - он просто запускает код.
Редактировать: я просто вернулся к winforms и попытался использовать этошаблон только потратить пару разочаровывающих минут, пытаясь понять, почему я не могу вызвать лямбду.Я подумал, что лучше вернуться и обновить этот ответ, чтобы добавить необходимый кастинг на тот случай, если кто-то еще попытается его использовать.