Il modo migliore per eseguire una semplice funzione su un nuovo thread?
-
05-07-2019 - |
Domanda
Ho due funzioni che voglio eseguire su thread diversi (perché sono roba di database e non sono immediatamente necessari).
Le funzioni sono:
getTenantReciept_UnitTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_Unit);
getTenantReciept_TenantNameTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_TenantName);
In javascript, so di poter creare creare una funzione anonima e chiamarla su un nuovo thread abbastanza facilmente con qualcosa del genere:
setTimeout(new function(){doSomethingImportantInBackground();}, 500);
C'è qualcosa di simile in C #?
Soluzione
La tua domanda non è molto chiara, temo. Puoi facilmente iniziare una nuova discussione con del codice, usando metodi anonimi in C # 2 ed espressioni lambda in C # 3:
Metodo anonimo:
new Thread(delegate() {
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit);
}).Start();
new Thread(delegate() {
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName);
}).Start();
Espressione lambda:
new Thread(() =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
).Start();
new Thread(() =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
).Start();
Puoi usare lo stesso tipo di sintassi per Control.Invoke
, ma è leggermente più complicato in quanto può richiedere qualsiasi delegato - quindi devi dire al compilatore quale tipo stai utilizzando anziché fare affidamento su una conversione implicita. Probabilmente è più facile scrivere:
EventHandler eh = delegate
{
// Code
};
control.Invoke(eh);
o
EventHandler eh = (sender, args) =>
{
// Code
};
control.Invoke(eh);
Come nota a margine, i tuoi nomi sono davvero così lunghi? Puoi accorciarli per ottenere un codice più leggibile?
Altri suggerimenti
L'avvio dei thread è relativamente costoso.
Potresti usare meglio un thread dal pool di thread:
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
);
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
);
Puoi usare un metodo anonimo:
void Foo()
{
Thread myThread = new System.Threading.Thread(delegate(){
//Your code here
});
myThread.Start();
}