5

テストに次のコードがあります。

 private void LoadIncomeStatementViewModel()
    {
        using (var evt = new AutoResetEvent(false))
        {
            EventHandler handler = (sender, e) => evt.Set();

            _incomeStatementViewModel.Loaded -= handler;
            _incomeStatementViewModel.Loaded += handler;
            _incomeStatementViewModel.LoadDataCommand.Execute(null);
            evt.WaitOne();
        }
    }

次のテストを実行すると

[Test]
public void Test()
{
   LoadIncomeStatementViewModel();
   // do something

   LoadIncomeStatementViewModel();
   // do something
}

LoadIncomeStatementViewModel() が 2 回目に呼び出されると、EventHandler handler = (sender, e) => evt.Set(); で「安全なハンドルが破棄されました」というエラー メッセージが表示されます。

メソッドが 2 回目に再実行されると、必ず using ステートメントによって evt が再初期化されます。これは、Resharper テスト ランナー (Nunit 2.7) と関係があるのではないかと感じています。

4

1 に答える 1

3

以下のようにハンドラーのリンクを解除する必要があります。それ以外の場合は、2 回目の実行で最初のインスタンスを受け取りました。

private void LoadIncomeStatementViewModel()
{
    using (var evt = new AutoResetEvent(false))
    {
        EventHandler handler = (sender, e) => evt.Set();

        try
        {
            _incomeStatementViewModel.Loaded += handler;
            _incomeStatementViewModel.LoadDataCommand.Execute(null);
            evt.WaitOne();
        }
        finally
        {
            _incomeStatementViewModel.Loaded -= handler;
        }
    }
}
于 2013-01-03T17:43:58.863 に答える