不要使用Func<>
,因爲它不返回任何東西。改爲使用Action
。
private void Checkbox_check()
{
if (checkBox1.InvokeRequired)
checkBox1.Invoke(new Action(Checkbox_check));
else
{
// do what you like to do on the ui context
// checkBox1.Checked; // bad here i know, yep...
}
}
從另一個線程獲取的選中狀態,你可以這樣做:
private bool Checkbox_check()
{
// result value.
bool result = false;
// define a function which assigns the checkbox checked state to the result
var checkCheckBox = new Action(() => result = checkBox1.Checked);
// check if it should be invoked.
if (checkBox1.InvokeRequired)
checkBox1.Invoke(checkCheckBox);
else
checkCheckBox();
// return the result.
return result;
}
我不會建議這,這可能導致死鎖等。我勸你傳遞檢查threadstart上的值,因此不必執行任何crossthread調用。
我認爲這裏的錯誤是該方法返回void,並且返回實際值。 – Maarten
絕對不要這樣寫代碼,這是最終的線程比賽錯誤。在開始線程之前獲取UI值。並確保用戶在線程運行時不能更改它(使用Enabled屬性),以便在線程中計算的結果始終與UI狀態保持一致。 BackgroundWorker使這一切變得簡單。 –