2

次のようなスレッドを作成するサンプルコードを見てきました。

var simpleThreads = new[] { 
            new Thread(new ThreadStart(ThreadSimple)), 
            new Thread(new ThreadStart(ThreadSimple)), 
            new Thread(new ThreadStart(ThreadSimple))
        };

論理的には、これは次と同じですか?

var ts = new ThreadStart(ThreadSimple);    
var simpleThreads = new[] { 
                new Thread(ts), 
                new Thread(ts), 
                new Thread(ts)
            };

両方のコードにストップウォッチを配置しましたが、ほぼ同じ時間がかかったので、1行のコードを保存するのでない限り、コードの最初のブロックがそのように記述されているのはなぜか疑問に思います。

4

4 に答える 4

0

私はこの答えを本当に信用することはできませんが、マーク・グラヴェルを引用すると、

それらは同じ効果を持ちます。それらは意味的に同等です。デリゲートが不変であることを支援します。

私自身の大失敗の方法で拡大すること。

これは実際にはスレッド化に関する質問ではありません。Thread等しいThreadStartデリゲートが渡された場合、コンストラクターは同等に機能します。

デリゲートタイプの重要な「属性」は、その不変性です。不変タイプがインスタンス化されると、変更することはできません。ThreadStart両方のコードサンプルのすべてのデリゲートがThreadSimpleメソッドグループで構築されているため、これは関連性があります。したがって、Threadデリゲートの有効期間に関係なく、すべてのインスタンス化に同等のデリゲートが渡されます。

于 2012-08-13T09:55:12.227 に答える
0
var simpleThreads = new[] 
{  new Thread(new ThreadStart(ThreadSimple)),
 new Thread(new ThreadStart(ThreadSimple)),
 new Thread(new ThreadStart(ThreadSimple))  }; 

と新しいスレッド(ts)は同じものではありません。

最初のコードブロックでは、単一のデリゲートを参照しながら3つの新しいthreadstartオブジェクトを生成しましたが、2番目のコードブロックでは、不要なオブジェクトを作成せず、LOCも保存していません。

于 2012-08-13T09:23:09.897 に答える
0

3つではなく1つのThreadStartしか作成しないので、2番目の方が良いと思いますが、このオブジェクトを複数のスレッドで共有するために問題が発生するかどうかはわかりません。

于 2012-08-13T09:17:11.553 に答える
0

2つのスニペットは論理的に同等ではありません
最初のオブジェクトにはThreadStartタイプの3つの異なるオブジェクトがあり、2番目のオブジェクトには1つしかありません。

于 2012-08-13T09:17:43.300 に答える