#c# #visual-studio #backgroundworker #code-analysis #idisposable
#c# #visual-studio #backgroundworker #анализ кода #idisposable
Вопрос:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (processFileBackgroundWorker != null)
{
processFileBackgroundWorker.Dispose();
processFileBackgroundWorker = null;
}
}
}
Я использую фонового рабочего в своей модели представления, и я получаю ошибку CA1001 в fxcop. Я понимаю, что мне нужно наследовать от Idisposable и реализовать вышеупомянутый интерфейс. Мне больше просто любопытно, как это работает, и если простое добавление этого кода произвольно в мой класс чего-нибудь достигнет. Я попытался установить точку останова, но этот код никогда не вызывается и не используется, и я был бы признателен за любые указания о том, как его правильно реализовать.
Комментарии:
1. Чтобы избавиться от предупреждений fxcop
2. Сумасшедший. Ты это сказал. Неважно.
3. Итак, если я правильно понимаю, dispose будет вызываться только при выходе из блока «using»
4. …чего не произойдет с viewmodel. Правильно. Вы можете вызвать Dispose() явно, когда viewmodels отбрасываются. Конечно, вам не нужно
IDisposable
для этого. Но fxcop, я думаю, не очень умный.5. правильно… что ж, спасибо за информацию, если вы хотите поместить некоторую комбинацию этих сообщений в качестве ответа, я приму
Ответ №1:
Если fxcop стучит ложкой по подносу и требует IDisposable
, а избавиться от fxcop невозможно, я предполагаю, что вам придется платить налоги.
В данном конкретном случае это немного глупо, потому что IDisposable
предназначено для удаления неуправляемых ресурсов, когда объект выходит за рамки using
блока или try
/ catch
, а viewmodels таким образом не выходят за рамки. Таким образом, при обычном использовании viewmodel ничего не вызывается Dispose()
.
Но вы часто отбрасываете их перед выходом из программы (при выходе из программы никого не волнует, будет ли что-нибудь удалено — все это отправляется прямиком в корзину). Я бы реализовал IDisposable
, заставил бы его правильно утилизировать BackgroundWorker
, как это делаете вы, и если в вашем коде есть точка, где экземпляр этой viewmodel отбрасывается, я бы явно вызвал Dispose()
ее. Вам не нужно IDisposable
для этого, но это безвредно.