Как избежать Безопасная ручка была закрыта

У меня есть следующий код в тесте:

 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(), я получаю сообщение об ошибке Safe handle is disposed в обработчике EventHandler = (sender, e) => evt.Set();

Конечно, оператор using повторно инициализировал evt, когда метод перезапускается во второй раз. У меня есть ощущение, что это может быть как-то связано с Resharper Test Runner (Nunit 2.7).


person Jeremy Holt    schedule 09.09.2010    source источник


Ответы (1)


Вам нужно отключить обработчик, как показано ниже. В противном случае при втором запуске вы получали первый экземпляр.

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;
        }
    }
}
person dperez    schedule 03.01.2013