Ошибка WebClient при использовании потока в .NET - PullRequest
2 голосов
/ 10 мая 2010

У меня очень странная ошибка при использовании класса WebClient в .NET 4.

Приложение просто загружает некоторые файлы из Интернета и обеспечивает вывод в текстовое поле (графический интерфейс пользователя WPF). Метод, который делает это следующим образом:

void DownloadFiles(object files) {
    var fileL = (List<string>) files;
    foreach (string url in fileL)
    {
        byte[] data;
        using (var k = new WebClient())
        {
             data = k.DownloadData(url);
        }
        //Bunch of irrelevant code goes here...
    }
}

(я добавил использование, пытаясь угадать [да, я отчаянный / невежественный] решение, проблема возникает, даже если веб-клиент объявлен и инициализирован вне цикла foreach)

Теперь проблема возникает только тогда, когда я выполняю этот метод в потоке, отдельном от основного потока пользовательского интерфейса WPF. Если он выполняется в потоке пользовательского интерфейса, он работает отлично. Когда создается новая тема с:

Thread t = new Thread(DownloadFiles);
t.Start(files);

В первый раз, когда код входит в цикл, он будет работать, но когда он пройдет второй цикл внутри цикла, я всегда получу исключение TargetParameterCountException.

Я не могу понять эту ошибку. Любая помощь очень ценится.

редактировать Вот подробности об исключении:

Exception.Message  = "Parameter count mismatch."
Exception.InnerException = null
Exception.Source = " mscorlib"

StackTrace следует:

at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.DispatcherOperation.InvokeImpl()     at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
at System.Threading.ExecutionContext.runTryCode(Object userData)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Windows.Threading.DispatcherOperation.Invoke()
at System.Windows.Threading.Dispatcher.ProcessQueue()
at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.Run()
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run(Window window)
at System.Windows.Application.Run()
at FileDownloader.App.Main() in d:\mis documentos\visual studio 2010\Projects\OneMangaDownloader\FileDownloader\obj\x86\Debug\App.g.cs:line 0
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

1 Ответ

0 голосов
/ 26 марта 2011

Я знаю, что есть ошибка в WebClient, когда он всегда помещает вызов в поток пользовательского интерфейса. Не уверен, что это вызывает проблемы.

Для получения дополнительной информации прочитайте это сообщение .

...