Я пытаюсь использовать объект AutoResetEvent для блокировки потока до асинхронизации. загрузка WebClient выполняется.Ошибка использования AutoResetEvent
Моя проблема в том, что когда я вызываю WaitOne(), поток просто блокируется там, и VS никогда не достигает точки останова в методе обработчика события DownloadComplete.
Вот мой код
//Class used to pass arguments to WebClient's events...
public class RunArgs
{
public JobInfo jobInfo;
public int jobTotal;
public int jobIndex;
public AutoResetEvent AutoResetEventObject;
}
List<JobInfo> jl = ConfigSectionWrapper.GetAllJobs();
int jobAmount = jl.Count;
int jobIndex = 0;
RunArgs args = new RunArgs();
args.jobTotal = jl.Count;
foreach (JobInfo ji in jl)
{
if (ji.enabled == "0")
{
args.jobIndex++;
continue;
}
try
{
args.jobIndex++;
args.jobInfo = ji;
appLog.Source = ji.eventSource;
appLog.WriteEntry(string.Format("Started job {0}...", ji.jobName), EventLogEntryType.Information);
ji.fullFileName = string.Format(ji.reportFileName, string.Format("{0}-{1}-{2}", DateTime.Now.Year.ToString(), DateTime.Now.Month.ToString().PadLeft(2, '0'), DateTime.Now.Day.ToString().PadLeft(2, '0')));
ji.fullFileName = string.Format("{0}{1}", ji.downloadDirectory, ji.fullFileName);
using (WebClient wc = new WebClient())
{
AutoResetEvent notifier = new AutoResetEvent(false);
args.AutoResetEventObject = notifier;
wc.Credentials = CredentialCache.DefaultNetworkCredentials;
wc.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
wc.DownloadFileAsync(new Uri(args.jobInfo.reportURL), args.jobInfo.fullFileName, args); //Pass the args params to event handler...
notifier.WaitOne();
}
}
catch (Exception ex)
{
appLog.WriteEntry(string.Format("Error starting report execution: {0}", ex.Message), EventLogEntryType.Error);
DeleteFile(ji.fullFileName);
}
}
private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{
RunArgs args = (RunArgs)e.UserState;
//Do things....
args.AutoResetEventObject.Set();
}
Так я создаю экземпляр уведомитель с ложным в конструкторе, потому что я не хочу его статус, чтобы сигнализировать уже. Разве я не читаю MSDN неправильно?
Все, что явно не так?
Да, это старый проект, который я работал несколько месяцев назад, и я думаю, что была причина, по которой я не использовал DownloadFile() (sync). Я думаю, что таймаут на нем не может быть расширен до моих потребностей (я загружаю отчеты SSRS, которые могут занять 5-10 минут) –
Вам нужно будет переписать это. Вам нужно будет хранить экземпляр «WebClient» (удалите оператор 'using') и вызовите' Dispose' на нем позже (например, когда вызывается обработчик событий). И ожидаем события на главной теме. –
Итак, Брайан, тогда вы не видите ничего плохого в коде, который я разместил? –