|
|
|
Supreme Being
      
администратор
Last Login: 13.11.2007 13:41
Сообщ.: 4 421,
Visits: 49 251
|
|
| кто-нибудь работал с оным? открываю в цикле запросы с неким таймаутом. цикл длинный, но похоже все заканчивается по истечение таймаута у первого запроса. если кто сталкивался с реальным использованием пришлю пример с проблемой
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Я с асинхроннымми страницами дело имел, а они предполагают использование асинхронных запросов. Выложи код, может смогу чем-то помочь.
|
|
|
|
|
Supreme Being
      
администратор
Last Login: 13.11.2007 13:41
Сообщ.: 4 421,
Visits: 49 251
|
|
в цикле чтение ссылок u из БД { WebRequest request = HttpWebRequest.Create(u); // u = "http://.... request.Method = "GET"; RequestState state = new RequestState(request, data, u); IAsyncResult result = request.BeginGetResponse( new AsyncCallback(UpdateDescription), state); ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(ScanTimeoutCallback), state, (5 * 60 * 1000), true); // 5 min timeout } // UpdateDescription это процедура обработки полученного ответа private void UpdateDescription(IAsyncResult result) { RequestState state = (RequestState)result.AsyncState; WebRequest request = (WebRequest)state.Request; HttpWebResponse r = (HttpWebResponse)request.EndGetResponse(result); Stream s = (Stream)r.GetResponseStream(); StreamReader readStream = new StreamReader(s); string dataString = readStream.ReadToEnd(); // полученный ответ сервера r.Close(); s.Close(); readStream.Close(); }private void ScanTimeoutCallback(object state, bool timedOut) { if (timedOut) { RequestState reqState = (RequestState)state; if (reqState != null) reqState.Request.Abort(); } } // RequestState это класс для формирования запроса public class RequestState { public WebRequest Request; // holds the request public object Data; // store any data in this public string SiteUrl; // holds the UrlString to match up results (Database lookup, etc). public RequestState(WebRequest request, object data, string siteUrl) { this.Request = request; this.Data = data; this.SiteUrl = siteUrl; } } вот и теперь проблема в следующем - цикл длинный, но после его начала происходит примерно 5 минут и запросы перестают выполняться (я это вижу по результатам работы), т.е. как я понимаю таймаут один на всех? мне надо чтобы таймаут был в 5 минут для каждого запроса.
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Извини, что долго не отвечал. Пытался лучше понять задачу и как ее решить. К сожалению в итоге так и не смог точно понять почему так происхожит :(. Таймаут в 5 минут точно индивидуальный, а не обший. Попробуй код внутри цикла вынести в отдельную функцию и сделай ее вызов с помощью ThreadPool.QueueUserWorkItem. Возможно, если запрос к сайтам будет начинаться из разных потоков, то проблема исчезнет.
|
|
|
|
|
Supreme Being
      
администратор
Last Login: 13.11.2007 13:41
Сообщ.: 4 421,
Visits: 49 251
|
|
| м.б. — надо пробовать кстати, насчет последнего параметра ThreadPool.RegisterWaitForSingleObject знаешь что? м.б. в нем еще проблема
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| RegisterWaitForSingleObject я вообще не пользовался никогда.
|
|
|
|