ThreadPool.QueueUserWorkItem - странное поведение (Asp.Net) - PullRequest
0 голосов
/ 04 февраля 2010

В настоящее время я использую ThreadPool.QueueUserWorkItem в приложении Asp.Net. Обычно пользователь загружает файл, используя форму с элементом управления FileUpload. Обработка файла может занять довольно много времени, что привело к истечению времени ожидания пользователя, а также к невозможности использования пользовательского интерфейса во время обработки загрузки. Поэтому я подумал, что просто вызову свой метод импорта следующим образом:

ThreadPool.QueueUserWorkItem(this.NameOfMyImportMethod);

Данные, с которыми должен работать метод импорта, были заданы как переменные класса при создании класса Import (я не делаю работу по импорту в коде!).

В большинстве случаев все работает нормально. Однако, казалось бы, случайным образом метод импорта НЕ вызывается асинхронно, браузер ждет ответа и в конечном итоге истекает время ожидания.

Я гарантирую, что перехватываю все исключения внутри метода импорта.

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

Есть идеи о том, что здесь может происходить?

Спасибо за любую помощь!

Ответы [ 3 ]

1 голос
/ 04 февраля 2010

Я предлагаю использовать Async Pages или Async Hanlder для загрузки файлов.

О загрузке файлов смотрите здесь: http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx

1 голос
/ 04 февраля 2010

Это немного длинно (особенно, если вы видите проблему в вашей среде разработки, где не должно быть большой конкуренции за эти потоки), но у вас могут быть исчерпаны потоки пула потоков и / или зашли в тупик, ожидая, когда они станут доступными.

Вы можете проверить, вставив что-то вроде следующего на своей странице, возможно, сразу после помещения делегата в очередь:

int workerThreads;
int maxWorkerThreads;
int completionPortThreads;
int maxCompletionPortThreads;

ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxCompletionPortThreads);

System.Diagnostics.Debug.WriteLine(string.Format("There are {0} of {1} worker threads available.\r\n", workerThreads, maxWorkerThreads));

Используете ли вы ThreadPool в другом месте страницы?

0 голосов
/ 05 февраля 2010

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

...