Избегайте утечки памяти при асинхронном таймауте - PullRequest
1 голос
/ 09 сентября 2011

Я пытаюсь найти утечку памяти в моем приложении, и я хочу знать, должен ли я (или должен) вызвать EndInvoke в случае тайм-аута.Я звоню во внешнюю систему, и у меня должен быть способ остановить ожидание, если выполнение слишком длинное:

Dim ar As IAsyncResult
Try
  ar = deleg.BeginInvoke(Nothing, New Object)
  If Not ar.AsyncWaitHandle.WaitOne(getTimeout, False) Then
    'Should I call EndInvoke here
    Throw New Exceptions.TimeoutException
  Else
    response = deleg.EndInvoke(ar)
  End If
Finally
  ar = Nothing
End Try

Спасибо

1 Ответ

0 голосов
/ 10 сентября 2011

Да, вам нужно позвонить EndInvoke. Но вы не можете вызывать его в ситуации тайм-аута (иначе это может заблокировать операцию, нарушая цель асинхронного выполнения и тайм-аутов).

Один из вариантов - выбросить его в пул потоков. Вы можете передать AsyncWaitHandle на ThreadPool.RegisterWaitForSingleObject и получить обратный вызов EndInvoke (обязательно перехватывая исключения). Однако этот подход не масштабируется (в любой момент времени в пуле потоков может быть только 64 дескриптора).

Лучшим вариантом является использование новой Task абстракции в .NET 4.0 (также доступно в .NET 3.5, если вы используете Rx). С ним гораздо проще работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...