¿La mejor manera de ejecutar una función simple en un nuevo hilo?
-
05-07-2019 - |
Pregunta
Tengo dos funciones que quiero ejecutar en subprocesos diferentes (porque son elementos de base de datos y no son necesarios de inmediato).
Las funciones son:
getTenantReciept_UnitTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_Unit);
getTenantReciept_TenantNameTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_TenantName);
En javascript, sé que puedo crear, crear una función anónima y llamarla en un nuevo hilo con bastante facilidad con algo como esto:
setTimeout(new function(){doSomethingImportantInBackground();}, 500);
¿Hay algo como esto en C #?
Solución
Tu pregunta no está muy clara, me temo. Puede iniciar fácilmente un nuevo hilo con algún código, utilizando métodos anónimos en C # 2, y expresiones lambda en C # 3:
Método anónimo:
new Thread(delegate() {
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit);
}).Start();
new Thread(delegate() {
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName);
}).Start();
Expresión Lambda:
new Thread(() =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
).Start();
new Thread(() =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
).Start();
Puede usar el mismo tipo de sintaxis para Control.Invoke
, pero es un poco más complicado ya que puede tomar delegado de any , por lo que debe indicarle al compilador qué tipo estás utilizando en lugar de confiar en una conversión implícita. Probablemente sea más fácil de escribir:
EventHandler eh = delegate
{
// Code
};
control.Invoke(eh);
o
EventHandler eh = (sender, args) =>
{
// Code
};
control.Invoke(eh);
Como nota al margen, ¿son tus nombres realmente tan largos? ¿Puedes acortarlos para obtener un código más legible?
Otros consejos
Iniciar hilos es relativamente caro.
Puede que sea mejor usar un hilo del grupo de hilos:
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
);
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
);
Puede usar un método anónimo:
void Foo()
{
Thread myThread = new System.Threading.Thread(delegate(){
//Your code here
});
myThread.Start();
}