Le meilleur moyen d’exécuter une fonction simple sur un nouveau thread?
-
05-07-2019 - |
Question
J'ai deux fonctions que je veux exécuter sur différents threads (car ce sont des bases de données, et elles ne sont pas nécessaires immédiatement).
Les fonctions sont les suivantes:
getTenantReciept_UnitTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_Unit);
getTenantReciept_TenantNameTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_TenantName);
En javascript, je sais que je peux créer assez facilement une fonction anonyme et l'appeler facilement sur un nouveau fil avec quelque chose comme ceci:
setTimeout(new function(){doSomethingImportantInBackground();}, 500);
Y a-t-il quelque chose comme ça en C #?
La solution
Je crains que votre question ne soit pas très claire. Vous pouvez facilement démarrer un nouveau fil 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 n'importe quel délégué - vous devez donc indiquer au compilateur quel type vous utilisez plutôt que de compter sur 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 note de bas de page, vos noms sont-ils vraiment longs? Pouvez-vous les raccourcir pour obtenir un code plus lisible?
Autres conseils
Le démarrage des discussions est relativement coûteux.
Vous feriez 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();
}