我有一些需要在應用程序啓動時填充的Janus網格控件。WinForms Control.BeginInvoke異步回調
我想加載這些網格在不同的線程上,以加快啓動時間和刷新這些網格所需的時間。每個網格都位於單獨的選項卡上。理想情況下,我想在每個網格上使用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已經完成,並取決於哪一個完成了,我可以重新啓用標籤控件的網格包含在內。有沒有更好的方法來做到這一點?
也許它可以幫助在填充之前和之後使用'SuspendLayout()'和'ResumeLayout(false)',以便網格不會被繪製爲立即狀態。 – Oliver 2010-03-01 11:00:58