J'ai un certain nombre de contrôles de grille Janus qui doivent être remplis au démarrage d'une application.WinForms Control.BeginInvoke rappel asynchrone
Je voudrais charger ces grilles sur différents threads pour accélérer le temps de démarrage et le temps qu'il faut pour actualiser ces grilles. Chaque grille est sur un onglet séparé. Idéalement, je voudrais utiliser Control.BeginInvoke sur chaque grille et sur la charge de la grille en complétant les onglets deviendra activé. Je sais qu'avec les délégués, vous pouvez effectuer un rappel asynchrone lors de l'utilisation de BeginInvoke, donc je pourrais activer les onglets dans le rappel asynchrone, cependant en utilisant Control.BeginInvoke, cela n'est pas possible. Y at-il un moyen de faire des rappels asynchrones en utilisant Control.BeginInvoke ou peut-être une meilleure solution?
Jusqu'à présent, j'ai:
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);
}
Maintenant, je pourrais essaimer un thread séparé et continuer de vérifier si les IAsynchResults ont terminé et selon laquelle on effectue je pouvais réactiver le contrôle de l'onglet que la la grille est contenue dans. Y at-il une meilleure façon de le faire?
Peut-être qu'il peut être utile d'utiliser aussi 'SuspendLayout()' et 'ResumeLayout (false)' avant et après le remplissage, afin que la grille ne soit pas peinte avec des états immédiats. – Oliver