2017-01-16 10 views
0

Я изучаю C#. Извините за вопрос о новичке.Является ли код, который генерируется автоматически с помощью Visual Studio в потоковом режиме?

Это часть некоторого кода, который автоматически генерируется Visual Studio 2015 при запуске проекта Windows Forms. Это в Form1.Designer.cs

protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

Я пытаюсь увидеть, если я понимаю концепцию безопасности потоков правильно. Невозможно ли установить components значение null между тем, как вычисляется оператор if и вызывается время components.Dispose()?

Заранее благодарим за помощь!

ответ

4

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

Однако это не значит, что это плохой код. Не весь код должен быть потокобезопасным. Если два потока удаляли один и тот же объект, весьма вероятно, что , что поведение является ошибкой, а не Dispose ошибочным.

+0

Тогда я правильно понял! Вы очень помогли. Спасибо. –

+0

Но код должен быть потокобезопасным, если он является частью некоторого API, который должен использоваться совместно и реализован сторонними кодерами? Или две нити, которые используют один и тот же объект, по-прежнему считаются ошибкой со стороны исполнителя, а не недостатком API? Я мог бы использовать немного больше вашего понимания, если все в порядке. –

+1

@KyleDelaney Обычно вам нужно реализовать 'IDisposable', если у вас есть неуправляемые ресурсы, необходимые для уборки. Было бы тривиально сделать вызов «потокобезопасным» в том, что вторичный вызов ничего не сделал (простая проверка флажка с помощью «Блокировка»), но это более защитная кодировка, а не ее поточное. Вы должны определить *, что это означает *, чтобы объект располагался дважды в одно и то же время. Я не вижу причины, по которой два потока считали бы, что им нужно распоряжаться объектом - как правило, тот, кто * вызвал * приобретение неуправляемых ресурсов, будет отвечать за очистку. – Rob

 Смежные вопросы

  • Нет связанных вопросов^_^