STA警告なしでMSTestでwaithandler.waitalを使用するにはどうすればいいですか?

StackOverflow https://stackoverflow.com/questions/3246207

質問

Visual Studioの組み込み単体テストソリューションを使用するときに、WaitHandle.WaitAll()を単体テストにする方法はあります。Visual Studioでこの機能を使用しているテストを実行してテストを実行すると、テストに失敗し、テスト結果を調べると、次のエラーが表示されます。

WaitAll for multiple handles on a STA thread is not supported
.

私のAPIのコードベースの量が増えているため、マルチスレッド操作を実行する他の手段とは対照的に、WaitAll()の使用をテストできます。

編集

Anthonyの提案に基づくこのようなコードを単位テスト環境で呼び出すために使用できる単純なヘルパーメソッド:

public static void TestInMTAThread(ThreadStart info)
{
    Thread t = new Thread(info);
    t.SetApartmentState(ApartmentState.MTA);
    t.Start();
    t.Join();
}
.

役に立ちましたか?

解決

あなたは2つの問題があるかもしれません。最初のものはあなたが述べたものです。"> STAスレッド(MSTestスレッドアパートメント状態)で。手動で作成されたMTAスレッドでそれを修正することができます。

public static void OnMtaThread(Action action)
{
    var thread = new Thread(new ThreadStart(action));
    thread.SetApartmentState(ApartmentState.MTA);
    thread.Start();
    thread.Join();
}
.

環境には最大待機ハンドル制限。.NET 2.0では、64にハードコーディングされているようです。制限以上の待っていると、NotSupportedExceptionが生成されます。 extence メソッドを使用して、チャンク内のすべての待機ハンドルを待ちます。

public static void WaitAll<T>(this List<T> list, TimeSpan timeout)
    where T : WaitHandle
{
    var position = 0;
    while (position <= list.Count)
    {
        var chunk = list.Skip(position).Take(MaxWaitHandles);
        WaitHandle.WaitAll(chunk.ToArray(), timeout);
        position += MaxWaitHandles;
    }
}
.

あなたのテストのようにそれらをこのようにそれらをまとめると(テストの行為またはアサート)

OnMtaThread(() => handles.WaitAll(Timespan.FromSeconds(10)));
.

他のヒント

Visual Studio 2008&2010 .testsettingsファイルを変更して、<ExecutionThread apartmentState="MTA" />を追加してMTAスレッドの下のテストを実行できます。

<Execution>
     <ExecutionThread apartmentState="MTA" />
</Execution>
.

私のVisual Studio 2010には、次の構成のみテストが機能しました。

<Execution>
     <ExecutionThread apartmentState="1" />
</Execution>
.

VS2008の場合、命令はVS2010と比較してわずかに異なります。VS2008の場合は、TestRunConfigファイルを編集し、次のものをTestRunConfiguration要素に追加します。

<ExecutionThread apartmentState="MTA" />
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top