IWebProxy Webclient потокобезопасный? - PullRequest
0 голосов
/ 04 октября 2010

При использовании WebClient для загрузки данных каждый раз при разрешении прокси-сервера возникает небольшая, но ощутимая задержка.Так как мне нужно вызывать методы, использующие веб-клиент несколько раз в разных потоках, а сам веб-клиент не является поточно-ориентированным, я подумал о том, чтобы вместо этого каждый раз просто создавать новый веб-клиент и устанавливать его прокси в предварительно инициализированный IWebProxy

Но является ли IWebProxy поточно-ориентированным, чтобы я мог это сделать, и есть ли какой-нибудь лучший способ сделать это?

1 Ответ

0 голосов
/ 05 ноября 2010

Если вы наблюдаете ухудшение производительности при поиске прокси в .NET, есть несколько способов решения проблемы:

  1. создайте объект WebProxy с использованием определенного прокси-хоста, вместо того чтобы полагаться на .NET для автоматического обнаружения веб-прокси, что, вероятно, вызывает медлительность, которую вы видите. Это работает в серверных сценариях, например, когда вы можете поместить прокси-сервер в файл конфигурации и забыть об этом. Это не работает в клиентском приложении, где вы не знаете прокси заранее.
  2. оберните объект WebProxy в вашей собственной реализации IWebProxy и поместите lock(this){ } вокруг каждого метода и свойства взаимодействия. Сделайте это, если вы не можете знать прокси-сервер заранее, или если вы настроили конкретный прокси-сервер, это не решит вашу проблему.
  3. Вы всегда можете загрузить справочный источник .NET Framework и просмотреть исходный код реализации WebProxy, чтобы увидеть, действительно ли он безопасен для потоков, несмотря на документацию. Я бы не советовал этот вариант, но я включил его здесь для полноты.

Дополнительная информация:

Интерфейсы (например, IWebProxy) не являются ни потокобезопасными, ни поточно-небезопасными. Это реализации под ними (например, класс WebProxy), которые определяют безопасность потоков.

Тем не менее, WebProxy не является потокобезопасным. Согласно документации MSDN для WebProxy :

Резьба безопасности

Любая общедоступная статика (Shared в Visual Основные) члены этого типа являются потоками безопасный. Любые члены экземпляра не являются гарантированно безопасна для ниток.

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

...