Der beste Weg, eine einfache Funktion auf einem neuen Thread laufen?
-
05-07-2019 - |
Frage
Ich habe zwei Funktionen, die ich auf verschiedene Threads ausgeführt werden soll (weil sie Datenbank Sachen sind, und sie sind sofort nicht erforderlich).
Die Funktionen sind:
getTenantReciept_UnitTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_Unit);
getTenantReciept_TenantNameTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_TenantName);
In Javascript, ich weiß, ich erstellen kann eine anonyme Funktion erstellen und auf einem neuen Thread rufen ganz einfach mit etwas wie folgt aus:
setTimeout(new function(){doSomethingImportantInBackground();}, 500);
Gibt es so etwas wie dies in C #?
Lösung
Ihre Frage ist nicht ganz klar, ich habe Angst.
: Sie können ganz einfach einen neuen Thread mit einigem Code, mit anonymen Methoden in C # 2 und Lambda-Ausdrücke in C # 3 beginnenAnonymous-Methode:
new Thread(delegate() {
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit);
}).Start();
new Thread(delegate() {
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName);
}).Start();
Lambda Ausdruck:
new Thread(() =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
).Start();
new Thread(() =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
).Start();
Sie können die gleiche Art von Syntax für Control.Invoke
verwenden, aber es ist etwas schwieriger als das nehmen alle delegieren - so müssen Sie den Compiler sagen, die Sie eingeben, verwenden, anstatt auf eine verlassen implizite Konvertierung. Es ist wahrscheinlich am einfachsten zu schreiben:
EventHandler eh = delegate
{
// Code
};
control.Invoke(eh);
oder
EventHandler eh = (sender, args) =>
{
// Code
};
control.Invoke(eh);
Als Randbemerkung, sind Ihre Namen so lange wirklich? Können Sie verkürzen sie lesbaren Code zu bekommen?
Andere Tipps
Threads starten ist relativ teuer.
Sie könnte besser sein, einen Thread aus dem Threadpool verwenden:
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
);
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
);
Sie können eine anonyme Methode verwenden:
void Foo()
{
Thread myThread = new System.Threading.Thread(delegate(){
//Your code here
});
myThread.Start();
}