35

異なるスレッドで実行したい 2 つの関数があります (これらはデータベースのものであり、すぐには必要ないため)。

機能は次のとおりです。

            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 ではラムダ式を使用して、いくつかのコードで新しいスレッドを簡単に開始できます。

匿名の方法:

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();

に同じ種類の構文を使用できますがControl.Invokeデリゲートを使用できるため、少し扱いに​​くいため、暗黙的な変換に依存するのではなく、使用している型をコンパイラに伝える必要があります。おそらく、次のように書くのが最も簡単です。

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

また

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

余談ですが、あなたの名前は本当にそんなに長いですか?より読みやすいコードを得るためにそれらを短くすることはできますか?

于 2009-10-21T20:07:34.223 に答える
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 に答える