35

我有两个要在不同线程上运行的函数(因为它们是数据库的东西,并且不需要立即使用)。

功能是:

            getTenantReciept_UnitTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_Unit);
            getTenantReciept_TenantNameTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_TenantName);

在 javascript 中,我知道我可以创建一个匿名函数并在一个新线程上很容易地调用它,如下所示:

setTimeout(new function(){doSomethingImportantInBackground();}, 500);

C#中有这样的东西吗?

4

4 回答 4

75

恐怕你的问题不是很清楚。您可以使用 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();

拉姆达表达式:

new Thread(() =>
    getTenantReciept_UnitTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_Unit)
).Start();
new Thread(() =>
    getTenantReciept_TenantNameTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_TenantName)
).Start();

您可以使用相同类型的语法 for Control.Invoke,但它可以接受任何委托,因此稍微复杂一些 - 因此您需要告诉编译器您正在使用哪种类型,而不是依赖于隐式转换。这可能是最容易写的:

EventHandler eh = delegate
{
    // Code
};
control.Invoke(eh);

或者

EventHandler eh = (sender, args) =>
{
    // Code
};
control.Invoke(eh);

作为旁注,你的名字真的那么长吗?你能缩短它们以获得更易读的代码吗?

于 2009-10-21T20:07:34.223 回答
29

与所说的类似 - 我发现任务有点简单(从.net 4开始支持,并且从.net 4.5开始可以按如下方式使用):

Task mytask = Task.Run(() => 
{
    //Lines of code
});
于 2014-03-22T22:48:17.437 回答
11

启动线程相对昂贵。

您可能最好使用线程池中的线程:

ThreadPool.QueueUserWorkItem(unused =>
    getTenantReciept_UnitTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_Unit)
);
ThreadPool.QueueUserWorkItem(unused =>
    getTenantReciept_TenantNameTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_TenantName)
);
于 2009-10-21T20:39:38.637 回答
8

您可以使用匿名方法:


void Foo()
{
    Thread myThread = new System.Threading.Thread(delegate(){
              //Your code here
     });
    myThread.Start();
}
于 2009-10-21T20:09:42.493 回答