スレッドプールの新しいスレッドに 2 つのパラメーターを渡すのは複雑な場合がありますが、ラムダ式と匿名メソッドを使用すれば、次のようにできるようです。
public class TestClass
{
public void DoWork(string s1, string s2)
{
Console.WriteLine(s1);
Console.WriteLine(s2);
}
}
try
{
TestClass test = new TestClass();
string s1 = "Hello";
string s2 = "World";
ThreadPool.QueueUserWorkItem(
o => test.DoWork(s1, s2)
);
}
catch (Exception ex)
{
//exception logic
}
ここで、この例を単純化しましたが、次の点が重要です。
- 渡される文字列オブジェクトは不変であるため、スレッドセーフです
- s1 変数と s2 変数は、try ブロックのスコープ内で宣言されます。このブロックは、作業をスレッド プールのキューに入れたらすぐに終了します。そのため、s1 変数と s2 変数はその後変更されることはありません。
これに何か問題がありますか?
別の方法は、test、s1、s2 の 3 つのメンバーを持つ不変型を実装する新しいクラスを作成することです。これは、現時点では何のメリットもない余分な作業のように思えます。