У меня есть программа, в которой мне нужно создать большое количество папок для внешнего сайта sharepoint (внешний смысл - я не могу использовать объектную модель sharepoint). Веб-запросы хорошо работают для этого, но просто выполнять их по одному (отправить запрос, ждать ответа, повторить) довольно медленно. Я решил многопоточность запросов, чтобы попытаться ускорить его. Программа значительно ускорилась, но через некоторое время (между 1-2 минутами или около того) начинают возникать исключения из параллелизма.
Код ниже, это лучший способ сделать это?
Semaphore Lock = new Semaphore(10, 10);
List<string> folderPathList = new List<string>();
//folderPathList populated
foreach (string folderPath in folderPathList)
{
Lock.WaitOne();
new Thread(delegate()
{
WebRequest request = WebRequest.Create(folderPath);
request.Credentials = DefaultCredentials;
request.Method = "MKCOL";
WebResponse response = request.GetResponse();
response.Close();
Lock.Release();
}).Start();
}
for(int i = 1;i <= 10;i++)
{
Lock.WaitOne();
}
Исключением является нечто вроде
Необработанное исключение: System.Net.WebException: невозможно подключиться к удаленному серверу ---> System.Net.Sockets.SocketException: обычно разрешено только одно использование каждого адреса сокета. 192.0.0.1:81
в System.Net.Sockets.Socket.DoConnect (EndPoint endPointSnapshot, SocketAddre
ss socketAddress)
в System.Net.Sockets.Socket.InternalConnect (EndPoint remoteEP)
в System.Net.ServicePoint.ConnectSocketInternal (логическое connectFailure, сокет s4, сокет s6, сокет и сокет, IP-адрес и адрес, состояние ConnectSocketState,
IAsyncResult asyncResult, Тайм-аут Int32, Исключение и исключение)