如何避免安全处理已关闭

时间:2010-09-09 23:53:07

标签: c# handle autoresetevent

我在测试中有以下代码:

 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 handler =(sender,e)=> evt.Set();

当方法第二次重新运行时,using语句肯定重新初始化了evt。我觉得这可能与Resharper Test Runner(Nunit 2.7)有关....

有关如何解决这个问题的想法吗?

由于 杰里米

1 个答案:

答案 0 :(得分:3)

您需要取消链接处理程序,如下所示。否则,在第二次运行中,您将收到第一个实例。

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