在新线程上运行简单函数的最佳方法?

Mal*_*ist 32 .net c# multithreading anonymous-function

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

功能是:

            getTenantReciept_UnitTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_Unit);
            getTenantReciept_TenantNameTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_TenantName);
Run Code Online (Sandbox Code Playgroud)

在javascript中,我知道我可以创建一个匿名函数并在一个新线程上使用这样的东西很容易地调用它:

setTimeout(new function(){doSomethingImportantInBackground();}, 500);
Run Code Online (Sandbox Code Playgroud)

在C#中有这样的东西吗?

Jon*_*eet 71

你的问题不是很清楚,我很害怕.您可以使用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();
Run Code Online (Sandbox Code Playgroud)

Lambda表达式:

new Thread(() =>
    getTenantReciept_UnitTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_Unit)
).Start();
new Thread(() =>
    getTenantReciept_TenantNameTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_TenantName)
).Start();
Run Code Online (Sandbox Code Playgroud)

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

EventHandler eh = delegate
{
    // Code
};
control.Invoke(eh);
Run Code Online (Sandbox Code Playgroud)

要么

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

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


JSi*_*ris 27

与上述内容类似 - 我发现任务更简单一些(从.net 4开始支持,可以从.net 4.5开始使用):

Task mytask = Task.Run(() => 
{
    //Lines of code
});
Run Code Online (Sandbox Code Playgroud)


oef*_*efe 10

启动线程相对昂贵.

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

ThreadPool.QueueUserWorkItem(unused =>
    getTenantReciept_UnitTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_Unit)
);
ThreadPool.QueueUserWorkItem(unused =>
    getTenantReciept_TenantNameTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_TenantName)
);
Run Code Online (Sandbox Code Playgroud)


Dan*_*uez 7

您可以使用匿名方法:


void Foo()
{
    Thread myThread = new System.Threading.Thread(delegate(){
              //Your code here
     });
    myThread.Start();
}
Run Code Online (Sandbox Code Playgroud)