Сообщение 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-сервис и сейчас нарисовалась проблема с освобождением памяти. Так что вот это вот освобождение тут как раз в тему. Но как? Я пока написал это в таком виде:
Вроде ничего не падает, но я пока сам до конца не понимаю этого куска.. Dispose() тут отрабатывает, это понятно. Но что там происходит с возвращением объекта? Успевает ли WCF сериализовать и отдать его клиенту? Гарантированно ли это? Что бы тут такое покурить для просветления?
Плюс, смущает то, что код, я так понимаю, не поддающийся юнит-тестированию — если WCF и сериализует объект, то в юниттесте я, наверное, получу объект, над которым только что произвели Dispose() и тест просто упадёт.
Я бегло порылся по интернету и нашёл какие-то упоминания атрибута AutoDispose, но просветления пока не пришло. На StackOverflow тоже какая-то чехарда — кто-то пишет, что нужно самому Dispose() вызывать, кто-то другой говорит, что WCF сам всё сделает, третьи советуют вообще не связываться с IDisposable-типами. Я и сам склоняюсь к последнему, но это на будущее. А пока нужно просто утечку ресурсов заткнуть.
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-сервис и сейчас нарисовалась проблема с освобождением памяти. Так что вот это вот освобождение тут как раз в тему. Но как? Я пока написал это в таком виде:
Вроде ничего не падает, но я пока сам до конца не понимаю этого куска.. Dispose() тут отрабатывает, это понятно. Но что там происходит с возвращением объекта? Успевает ли WCF сериализовать и отдать его клиенту? Гарантированно ли это? Что бы тут такое покурить для просветления?
Плюс, смущает то, что код, я так понимаю, не поддающийся юнит-тестированию — в юниттесте я, наверное, получу объект, над которым только что произвели Dispose() и тест просто упадёт.
Я бегло порылся по интернету и нашёл какие-то упоминания атрибута AutoDispose, но просветления пока не пришло. На StackOverflow тоже какая-то чехарда — кто-то пишет, что нужно самому Dispose() вызывать, кто-то другой говорит, что WCF сам всё сделает, третьи советуют вообще не связываться с IDisposable-типами. Я и сам склоняюсь к последнему, но это на будущее. А пока нужно просто утечку ресурсов заткнуть.
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-типами. Я и сам склоняюсь к последнему, но это на будущее. А пока нужно просто утечку ресурсов заткнуть.