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

È stato utile?

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

Simile a quanto detto - Trovo che le attività siano un po 'più semplici (supportate da .net 4 e può essere utilizzato come segue a partire da . net 4.5 ):

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

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top