Кусок кода был воспитан кем я разговаривал:объектов и вывоз мусора до события запуска
private void DownloadInformation(string id)
{
using (WebClient wc = new WebClient())
{
wc.DownloadStringCompleted +=
new DownloadStringCompletedEventHandler(DownloadStringCompleted);
wc.DownloadStringAsync(new Uri("http://www.fake.com/" + id));
}
}
Выше упрощенная версия этого:
(У меня есть разрешение на публикацию изображения.)
Что меня беспокоит о том, что код связан с обработчиком событий, вызывается DownloadStringAsync()
, а затем заканчивается блок using
, который вызывает Dispose()
по адресу WebClient
. Есть ли что-либо, что предотвратит удаление WebClient
на using
и даже сбор мусора до DownloadStringAsync()
завершение и DownloadStringCompleted
событие запуска?
Там более новый метод, DownloadStringTaskAsync()
, который я хотел бы думать, чтобы использовать в сочетании с await
:
private async Task DownloadInformation(string id)
{
using (WebClient wc = new WebClient())
{
wc.DownloadStringCompleted += DownloadStringCompleted;
await wc.DownloadStringTaskAsync(new Uri("http://www.fake.com/" + id));
}
}
Однако, даже тогда ... Я бы в принципе быть пари, что триггеры событий и обработчик вызывается до того, как WebClient
отключается.
Неужели я не понимаю жизненный цикл WebClient
в этом сценарии или это ужасный дизайн кода?
Вам не нужно событие с 'DownloadStringTaskAsync'. Задача должна содержать окончательные результаты. Другими словами: 'var content = await wc.DownloadStringTaskAsync (...);'. –
@ LasseV.Karlsen Хорошая точка - это определенно позаботится об этой проблеме. С учетом сказанного, я определенно неспокойно отношусь к первому фрагменту кода. –
Первый пример ужасно разбит. Не используйте его. Оставляйте клиента до завершения события. –