在新线程上运行简单函数的最佳方法?
-
05-07-2019 - |
题
我有两个函数需要在不同的线程上运行(因为它们是数据库的东西,并且它们不是立即需要的。)
功能是:
getTenantReciept_UnitTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_Unit);
getTenantReciept_TenantNameTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_TenantName);
在javascript中,我知道我可以创建一个匿名函数并使用类似的东西轻松地在新线程上调用它:
setTimeout(new function(){doSomethingImportantInBackground();}, 500);
C#中有这样的东西吗?
解决方案
你的问题不是很清楚,我很害怕。您可以使用C#2中的匿名方法和C#3中的lambda表达式轻松地使用某些代码启动新线程:
匿名方法:
new Thread(delegate() {
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit);
}).Start();
new Thread(delegate() {
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName);
}).Start();
Lambda表达式:
new Thread(() =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
).Start();
new Thread(() =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
).Start();
您可以对 Control.Invoke
使用相同类型的语法,但它稍微棘手,因为它可以使任何委托 - 所以你需要告诉编译器哪种类型你正在使用而不是依赖隐式转换。这可能是最容易写的:
EventHandler eh = delegate
{
// Code
};
control.Invoke(eh);
或
EventHandler eh = (sender, args) =>
{
// Code
};
control.Invoke(eh);
作为旁注,你的名字真的那么长吗?你能缩短它们以获得更易读的代码吗?
其他提示
启动线程相对昂贵。
您最好使用线程池中的线程:
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
);
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
);
您可以使用匿名方法:
void Foo()
{
Thread myThread = new System.Threading.Thread(delegate(){
//Your code here
});
myThread.Start();
}
不隶属于 StackOverflow