Информация об изменениях

Сообщение Re[2]: WCF и IDisposable от 11.05.2017 7:19

Изменено 11.05.2017 7:21 Artem Korneev

Re[2]: WCF и IDisposable
Здравствуйте, Sinix, Вы писали:

AK>>Наткнулся тут на один метод в WCF-сервисе, который возвращает DataTable, а это Disposable тип.

S>Ниччего страшного.
[...]
S>MarshalByValueComponent calls GC.SuppressFinalize(this) in its Dispose() — skipping this means having to wait for dozens if not hundreds of Gen0 collections before memory is reclaimed.

Ну.. то есть оно как бы и не обязательно, но желательно. Так?..
У меня WCF-сервис и сейчас нарисовалась проблема с освобождением памяти. Так что вот это вот освобождение тут как раз в тему. Но как? Я пока написал это в таком виде:

public DataTable Foo()
{
    DataTable dataTable = null;
    try
    {
        dataTable = GetFoo();
        return dataTable;
    }
    finally
    {
        dataTable.Dispose();
    }
}


Вроде ничего не падает, но я пока сам до конца не понимаю этого куска.. Dispose() тут отрабатывает, это понятно. Но что там происходит с возвращением объекта? Успевает ли WCF сериализовать и отдать его клиенту? Гарантированно ли это? Что бы тут такое покурить для просветления?

Плюс, смущает то, что код, я так понимаю, не поддающийся юнит-тестированию — если WCF и сериализует объект, то в юниттесте я, наверное, получу объект, над которым только что произвели Dispose() и тест просто упадёт.

Я бегло порылся по интернету и нашёл какие-то упоминания атрибута AutoDispose, но просветления пока не пришло. На StackOverflow тоже какая-то чехарда — кто-то пишет, что нужно самому Dispose() вызывать, кто-то другой говорит, что WCF сам всё сделает, третьи советуют вообще не связываться с IDisposable-типами. Я и сам склоняюсь к последнему, но это на будущее. А пока нужно просто утечку ресурсов заткнуть.
Re[2]: WCF и IDisposable
Здравствуйте, Sinix, Вы писали:

AK>>Наткнулся тут на один метод в WCF-сервисе, который возвращает DataTable, а это Disposable тип.

S>Ниччего страшного.
[...]
S>MarshalByValueComponent calls GC.SuppressFinalize(this) in its Dispose() — skipping this means having to wait for dozens if not hundreds of Gen0 collections before memory is reclaimed.

Ну.. то есть оно как бы и не обязательно, но желательно. Так?..
У меня WCF-сервис и сейчас нарисовалась проблема с освобождением памяти. Так что вот это вот освобождение тут как раз в тему. Но как? Я пока написал это в таком виде:

public DataTable Foo()
{
    DataTable dataTable = null;
    try
    {
        dataTable = GetFoo();
        return dataTable;
    }
    finally
    {
        dataTable.Dispose();
    }
}


Вроде ничего не падает, но я пока сам до конца не понимаю этого куска.. Dispose() тут отрабатывает, это понятно. Но что там происходит с возвращением объекта? Успевает ли WCF сериализовать и отдать его клиенту? Гарантированно ли это? Что бы тут такое покурить для просветления?

Плюс, смущает то, что код, я так понимаю, не поддающийся юнит-тестированию — в юниттесте я, наверное, получу объект, над которым только что произвели Dispose() и тест просто упадёт.

Я бегло порылся по интернету и нашёл какие-то упоминания атрибута AutoDispose, но просветления пока не пришло. На StackOverflow тоже какая-то чехарда — кто-то пишет, что нужно самому Dispose() вызывать, кто-то другой говорит, что WCF сам всё сделает, третьи советуют вообще не связываться с IDisposable-типами. Я и сам склоняюсь к последнему, но это на будущее. А пока нужно просто утечку ресурсов заткнуть.