A melhor maneira de executar uma simples função em um novo segmento?
-
05-07-2019 - |
Pergunta
Eu tenho duas funções que eu quero correr em diferentes tópicos (porque eles são coisas de banco de dados, e eles não são necessários imediatamente).
As funções são:
getTenantReciept_UnitTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_Unit);
getTenantReciept_TenantNameTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_TenantName);
Em javascript, eu sei que posso criar criar uma função anônima e chamá-lo em um novo segmento com bastante facilidade com algo parecido com isto:
setTimeout(new function(){doSomethingImportantInBackground();}, 500);
Existe algo parecido com isso em C #?
Solução
A sua pergunta não é muito clara, eu tenho medo. Você pode facilmente iniciar um novo tópico com algum código, usando métodos anônimos em C # 2 e expressões lambda em 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();
expressão Lambda:
new Thread(() =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
).Start();
new Thread(() =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
).Start();
Você pode usar o mesmo tipo de sintaxe para Control.Invoke
, mas é um pouco mais complicado, como que pode levar qualquer delegado - então você precisa dizer ao compilador que tipo você está usando, em vez de contar com um conversão implícita. É provavelmente mais fácil de escrever:
EventHandler eh = delegate
{
// Code
};
control.Invoke(eh);
ou
EventHandler eh = (sender, args) =>
{
// Code
};
control.Invoke(eh);
Como uma nota lateral, são os seus nomes realmente tanto tempo? você pode encurtar-los para obter o código mais legível?
Outras dicas
A partir de tópicos é relativamente caro.
Você pode ser melhor do usando um thread do pool de threads:
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
);
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
);
Você pode usar um método anônimo:
void Foo()
{
Thread myThread = new System.Threading.Thread(delegate(){
//Your code here
});
myThread.Start();
}