STA警告なしでMSTestでwaithandler.waitalを使用するにはどうすればいいですか?
-
15-09-2020 - |
質問
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" />
. 所属していません StackOverflow