[英]Getting Cross-thread operation not valid in SetWindowPos()
我試圖從一個不同的線程訪問一個表單到創建表單的表單,最后得到一個錯誤:
跨線程操作無效
碼:
public static void MakeTopMost(Form form)
{
SetWindowPos(form.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
}
我正在傳遞一個在另一個線程中運行的表單。 我試過測試InvokeRequired
,但它總是假的。
我是線程新手。
確保您正在為InvokeRequired
測試正確的對象:
public static void MakeTopMost(Form form)
{
if (form.InvokeRequired)
{
form.Invoke((Action)delegate { MakeTopMost(form); });
return;
}
SetWindowPos(form.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
}
我喜歡用這樣的擴展方法包裝所有這些:
public static class SynchronizeInvokeUtil
{
public static void SafeInvoke(this ISynchroniseInvoke sync, Action action)
{
if (sync.InvokeRequired)
sync.Invoke(action);
else
action();
}
public static void SafeBeginInvoke(this ISynchroniseInvoke sync,
Action action)
{
if (sync.InvokeRequired)
sync.BeginInvoke(action);
else
action();
}
}
然后你可以打電話:
form.SafeInvoke(() => SetWindowPos(form.Handle, HWND_TOPMOST,
0, 0, 0, 0, TOPMOST_FLAGS));
這可能是最具可讀性的。
請注意,如果您在表單類本身中使用它,則必須使用this.SafeInvoke(...)
才能訪問擴展方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.