Осуществление IDisposable в демонстрации класса Начинает/Заканчивает методы

Скажите, что у меня есть класс, который выставляет BeginLongOperation() и EndLongOperation() , методы со стандартом Начинают/Заканчивают образец и орудия IDisposable .

Это - обязанность моего класса обращаться с требованием , Располагают() между требованиями BeginLongOperation() и EndLongOperation() ?

Если так, что надлежащий путь состоит в том, чтобы сделать это?

8
nl ja de

4 ответы

Это - обязанность моего класса обращаться с требованием Расположить() между звонки в BeginLongOperation() и EndLongOperation ()?

Нет, это - ответственность посетителя вашего класса, чтобы правильно расположить его. Это могло быть сделано в EndLongOperation метод. Вы не можете обернуть случай в использование заявление, потому что BeginLongOperation метод немедленно возвратится.

Пример с WebClient :

var client = new WebClient();
client.DownloadStringCompleted += (sender, e) =>
{
    try
    {
        if (e.Error == null)
        {
            Console.WriteLine(e.Result);
        }
    }
    finally
    {
        ((WebClient)sender).Dispose();
    }
};
client.DownloadStringAsync(new Uri("http://www.google.com"));
4
добавлено

Я предполагаю, что Начинают/Заканчивают, методы асинхронные. Или, что вашими объектами можно управлять от другой нити.

Во-первых, необходимо определить, необходимо ли действительно расположить случаи класса. Если так, необходимо проектировать ваш Располагать() метод (класс должен осуществить IDisposable интерфейс) таким способом, которым это не вмешается в долгую выполняемую операцию. Ну, это зависит, какую политику вы хотите проводить: вы хотите ждать долгой операции, чтобы закончиться, или требование Расположить (), метод должен прервать долгую операцию?

Обычно вы никогда не звоните, Располагают() метод от вашего класса в коде, но действительно необходимо защитить Расположение() требование из несоответствующего использования.

, Таким образом, я думаю, что это - ВАША обязанность защитить ваш код от любых возможных сценариев, даже от (нежеланного) требования между, Начинаются и Конец.

ПОЗЖЕ ОТРЕДАКТИРУЙТЕ: конечно, как другие парни здесь сказали вам, ответственность пользователя вашего класса состоит в том, чтобы правильно использовать его, НО я НЕ полагался бы на это. Как вы знаете, когда последней ссылки на ваш объект не стало, ваш объект подвергается, чтобы быть собранным мусором. Этот плохой образец использования мог действительно определить требование Расположить() между Началом/Концом даже в non-async/единственный дизайн нити.

1
добавлено
Это - то, что я думал, но wasn' t уверенный, спасибо.
добавлено автор Mills, источник

Идея позади IDisposable ниже, и я думаю, что это отвечает на ваш вопрос также.

Основное использование этого интерфейса должно высвободить неуправляемые средства. Сборщик "мусора" автоматически выпускает память, ассигнованную управляемому объекту, когда тот объект больше не используется. Однако не возможно предсказать, когда сборка мусора произойдет. Кроме того, сборщик "мусора" не знает о неуправляемых ресурсах, таких как ручки окна, или открытые файлы и потоки.

Используйте Расположить метод этого интерфейса, чтобы явно высвободить неуправляемые средства вместе со сборщиком "мусора". потребитель объекта может назвать этот метод, когда объект больше не необходим.

Таким образом, его обязанность разработчика, который использует ваш класс, чтобы звонить, Располагает ().

0
добавлено

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

Можно звонить, избавляются от такого класса в укладчике EndLongOperation в классе, который использует этот объект.

0
добавлено
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)