J'ai deux fonctions que je veux exécuter sur des threads différents (car ce sont des trucs de base de données et ils ne sont pas nécessaires immédiatement).
Les fonctions sont:
getTenantReciept_UnitTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_Unit);
getTenantReciept_TenantNameTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_TenantName);
En javascript, je sais que je peux créer créer une fonction anonyme et l'appeler sur un nouveau thread assez facilement avec quelque chose comme ceci:
setTimeout(new function(){doSomethingImportantInBackground();}, 500);
Y a-t-il quelque chose comme ça en C #?
Votre question n'est pas très claire, je le crains. Vous pouvez facilement démarrer un nouveau thread avec du code, en utilisant des méthodes anonymes en C # 2 et des expressions lambda en C # 3:
Méthode anonyme:
new Thread(delegate() {
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit);
}).Start();
new Thread(delegate() {
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName);
}).Start();
Expression lambda:
new Thread(() =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
).Start();
new Thread(() =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
).Start();
Vous pouvez utiliser le même type de syntaxe pour Control.Invoke
, mais c'est un peu plus délicat car cela peut prendre tout délégué - vous devez donc indiquer au compilateur le type que vous utilisez plutôt que de vous fier à une conversion implicite. Il est probablement plus facile d'écrire:
EventHandler eh = delegate
{
// Code
};
control.Invoke(eh);
ou
EventHandler eh = (sender, args) =>
{
// Code
};
control.Invoke(eh);
En passant, vos noms sont-ils vraiment aussi longs? Pouvez-vous les raccourcir pour obtenir un code plus lisible?
Le démarrage des threads est relativement coûteux.
Vous pourriez être mieux d'utiliser un thread du pool de threads:
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
);
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
);
Vous pouvez utiliser une méthode anonyme:
void Foo()
{
Thread myThread = new System.Threading.Thread(delegate(){
//Your code here
});
myThread.Start();
}