簡體   English   中英

WinForms Control.BeginInvoke異步回調

[英]WinForms Control.BeginInvoke asynchronous callback

我有一些需要在應用程序啟動時填充的Janus網格控件。

我想在不同的線程上加載這些網格,以加快啟動時間和刷新這些網格所需的時間。 每個網格都在一個單獨的選項卡上。 理想情況下,我想在每個網格上使用Control.BeginInvoke,並且在網格加載上完成選項卡將變為啟用狀態。

我知道使用Delegates,你可以在使用BeginInvoke時進行異步回調,所以我可以在異步回調中啟用選項卡,但是當使用Control.BeginInvoke時,這是不可能的。 有沒有辦法使用Control.BeginInvoke進行異步回調或可能是更好的解決方案?

到目前為止,我有:

public delegate void BindDelegate(IMyGrid grid);

private IAsyncResult InvokeBind(IMyGrid grid)
{
  return ((Control)grid).BeginInvoke(
    new BindDelegate(DoBind), new object[] { grid }
  );
}

private void DoBind(IMyGrid grid)
{
  grid.Bind(); // Expensive operation
}

private void RefreshComplete()
{
  IAsyncResult grid1Asynch = InvokeBind(grid1);
  IAsyncResult grid2Asynch = InvokeBind(grid2);
  IAsyncResult grid3Asynch = InvokeBind(grid2);
  IAsyncResult grid4Asynch = InvokeBind(grid3);
  IAsyncResult grid5Asynch = InvokeBind(grid4);
  IAsyncResult grid6Asynch = InvokeBind(grid5);
}

現在我可以分離一個單獨的線程並繼續檢查IAsynchResults是否已經完成,並且根據哪一個完成,我可以重新啟用包含網格的Tab控件。有更好的方法嗎?

任何直接操作Control (包含所有標准和擴展WinForms控件的實例)都必須在創建該控件的線程上完成。 Windows GUI不是線程安全的,實際上每個窗口創建(並且大多數控件將創建至少一個)具有線程關聯。

通常, Control.BeginInvoke被其他線程用於在GUI線程上執行某些操作,因此可以正確讀取或設置屬性。

您當然可以在線程池中啟動工作項以獲取稍后將填充網格的數據,但實際配置和網格(包括數據綁定)必須在GUI線程上完成。 如果需要時間來獲取數據,這可能是一個好主意(但由於數據源的爭用而不是一次性完成所有這些可能會更慢),因為您可以獲得GUI響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM