Как избежать Безопасная ручка закрыта - PullRequest
5 голосов
/ 10 сентября 2010

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

 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 () вызывается, я получаю "Безопасный дескриптор был удален »сообщение об ошибке в обработчике EventHandler = (отправитель, e) => evt.Set ();

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

Есть мысли о том, как это обойти?

Спасибо, Джереми

1 Ответ

3 голосов
/ 03 января 2013

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

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;
        }
    }
}
...