web-dev-qa-db-fra.com

La meilleure façon d'exécuter une fonction simple sur un nouveau thread?

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 #?

31
Malfist

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?

70
Jon Skeet

Semblable à ce qui a été dit - je trouve les tâches un peu plus simples (prises en charge à partir de . Net 4 et peuvent être utilisées comme suit à partir de . Net 4.5 ):

Task mytask = Task.Run(() => 
{
    //Lines of code
});
27
JSideris

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)
);
10
oefe

Vous pouvez utiliser une méthode anonyme:


void Foo()
{
    Thread myThread = new System.Threading.Thread(delegate(){
              //Your code here
     });
    myThread.Start();
}
7
Daniel Rodriguez