You have to Invoke() so you can wait for the function to return and obtain its return value. You’ll also need another delegate type. This ought to work:
public static string readControlText(Control varControl) {
if (varControl.InvokeRequired) {
return (string)varControl.Invoke(
new Func<String>(() => readControlText(varControl))
);
}
else {
string varText = varControl.Text;
return varText;
}
}