web-dev-qa-db-ja.com

新しいスレッドで単純な関数を実行する最良の方法は?

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

機能は次のとおりです。

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

Javascriptでは、匿名関数を作成し、次のようなもので新しいスレッドで非常に簡単に呼び出すことができます:

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

C#にはこのようなものがありますか?

31
Malfist

あなたの質問はあまり明確ではありません、私は恐れています。 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に対して同じ種類の構文を使用できますが、それはanyデリゲートを取ることができるので少し複雑です。したがって、使用する型に依存するのではなく、コンパイラに伝える必要があります暗黙的な変換。書くのがおそらく最も簡単でしょう:

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

または

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

サイドノートとして、あなたの名前は本当にそんなに長いですか?より読みやすいコードを取得するためにそれらを短縮できますか?

70
Jon Skeet

言われたことに似ています-私はタスクが少しシンプルであることがわかります( 。net 4 の時点でサポートされており、 。net 4.5 の時点で次のように使用できます):

Task mytask = Task.Run(() => 
{
    //Lines of code
});
27
JSideris

スレッドの開始は比較的高価です。

スレッドプールのスレッドを使用した方がよい場合があります。

ThreadPool.QueueUserWorkItem(unused =>
    getTenantReciept_UnitTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_Unit)
);
ThreadPool.QueueUserWorkItem(unused =>
    getTenantReciept_TenantNameTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_TenantName)
);
10
oefe

匿名メソッドを使用できます:


void Foo()
{
    Thread myThread = new System.Threading.Thread(delegate(){
              //Your code here
     });
    myThread.Start();
}
7