1

呼び出されるパラメーターとしてメソッドを渡すなど、一部のデリゲートの動作が少し弱いです。いくつかのNUnitテストスクリプトを実行しようとしているときに、多くのテストを実行する必要があるものがあります。これらの各テストでは、GUIを作成する必要があるため、STAスレッドが必要です。だから、私は次のようなものを持っています

public class MyTest
{

   // the Delegate "ThreadStart" is part of the System.Threading namespace and is defined as
   // public delegate void ThreadStart();
   protected void Start_STA_Thread(ThreadStart whichMethod)
   {
      Thread thread = new Thread(whichMethod);
      thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
      thread.Start();
      thread.Join();
   }

   [Test]
   public void Test101()
   { 
      // Since the thread issues an INVOKE of a method, I'm having it call the
      // corresponding "FromSTAThread" method, such as
      Start_STA_Thread( Test101FromSTAThread );
   }

   protected void Test101FromSTAThread()
   {
      MySTA_RequiredClass oTmp = new MySTA_RequiredClass();
      Assert.IsTrue( oTmp.DoSomething() );
   }
}

この部分はすべて正常に機能します...次のステップです。私は今、STAスレッドも必要とする別のテストセットを持っています。ただし、私が行う必要のある各「こと」には、2つのパラメーターが必要です...両方の文字列(この場合)。

呼び出す必要のあるメソッドと、2つの文字列パラメーターを1回のショットで渡すことができるように、適切なデリゲートを宣言するにはどうすればよいですか...このパターンで実行するテストが20以上ある可能性があり、他の同様の将来の可能性がありますさまざまなパラメーター数とパラメーターのタイプを使用したテストも行います。

ありがとう。

4

1 に答える 1

2

ラムダ式を使用できます。

これは、パラメーターを受け入れるテストで呼び出す変更されたメソッドです。

protected void Test101FromSTAThread(String arg1, Int32 arg2)
{
}

Start_STA_Threadそして、ラムダ式を使用して呼び出す方法は次のとおりです。

public void Test101()
{
   Start_STA_Thread(() => Test101FromSTAThread("foobar", 123));
}

この場合のラムダ式は次のとおりです。

() => Test101FromSTAThread("foobar", 123)

ThreadStartこれは、必要なデリゲートと一致します。どちらも、void戻り型を持つパラメーターのないメソッドです。

ラムダ式に慣れていない場合は、MSDNのラムダ式(C#プログラミングガイド)を読んで詳細を学ぶことができます。ラムダ式は無名関数であり、ここでデリゲートを作成します。デリゲートはスレッドに渡され、スレッドが開始すると無名関数が実行されます。この場合、スレッドが関係しているため、匿名関数は、テストランナースレッドではなく、作成したスレッドで実行されます。

C#でラムダ式を使用すると、コンパイラーは無名関数を表す「面白い」名前の関数を出力します。ラムダ式が字句環境からの変数(たとえば、ラムダ式の前に定義されたローカル変数)を使用する場合、コンパイラーは特別な型(ここでも「面白い」名前)内に無名関数を生成して、いわゆるクロージャーを作成します。これにより、コンパイラーは変数を字句環境から特殊型の状態にキャプチャし、後で無名関数が実行されるときにそれを使用できます。あなたの場合、これはスレッドの開始時に発生します。

上記のコードは次のようなものを生成します(「面白い」名前<Test101>b__0はもちろんコンパイルされませんが、ILでは完全に有効です)。

public void Test101()
{
   Start_STA_Thread(<Test101>b__0);
}

// The "anonymous" function.
void <Test101>b__0()
{
   Test101FromSTAThread("foobar", 123);
}

デリゲート<Test101>b__0として使用する方法に注意してください。ThreadStart

于 2012-06-11T15:50:54.193 に答える