Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > DownloadStringAsync + timeout 10 сек


Автор: Тигер 27.7.2013, 13:30
Пытаюсь сделать timeout для WebClient. Впринципе нашел разные способы, но не могу понять почему мой не работает...
Всегда переходит на метку theEnd;
Код

                    wc.DownloadStringCompleted += (ender,args)=>
                    {
                        res = args.Result;
                        var cook = Regex.Matches(wc.ResponseHeaders.ToString(), "Set\\-Cookie:\\s*([\\w\\-_\\.]+\\s*=\\s*[^;]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline);
                        foreach (Match val in cook)
                            cookies += val.Groups[1].Value.Trim() + "; ";
                    };
                    wc.DownloadStringAsync(new System.Uri(url));

                    int msec = 0;
                    while (String.IsNullOrEmpty(res))
                    {
                        Thread.Sleep(1);
                        ++msec;
                        if (msec >= 10000)
                        {
                            lastError = "TimeOut";
                            goto theEnd;
                        }
                    }
                    return res;


подозреваю что Sleep блокирует главный поток и поэтому событие не вызывается, если конечно событие вызывается в главном потоке...
Как быть в этом случае, мне не хочется использовать обертку над ВебКлиентом или Task, данные методы мне кажутся избыточными...

Автор: Тигер 27.7.2013, 23:18
Таки сделал ) радость
Код

                   var thread = new Thread(delegate()
                    {  
                            wc.DownloadStringCompleted += (sender, args) =>
                            {
                                try
                                {
                                    res = args.Result;
                                    var cook = Regex.Matches(wc.ResponseHeaders.ToString(), "Set\\-Cookie:\\s*([\\w\\-_\\.]+\\s*=\\s*[^;]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline);
                                    foreach (Match val in cook)
                                        cookies += val.Groups[1].Value.Trim() + "; ";
                                }
                                catch (Exception e)
                                {
                                    lastError = e.Message;
                                }
                            };
                            wc.DownloadStringAsync(new System.Uri(url));
                       
                    });
                    thread.IsBackground = true;
                    thread.Start();

                    int msec = 0;
                    while (String.IsNullOrEmpty(res))
                    {
                        Thread.Sleep(1);
                        ++msec;
                        if (msec >= 10000)
                        {
                            lastError = "TimeOut";
                            goto theEnd;
                        }
                        if (!String.IsNullOrEmpty(lastError))
                        {
                            goto theEnd;
                        }
                    }
                    return res;

Автор: infarch 29.7.2013, 15:41
В вашем случае все можно сделать граздо проще, вот посмотрите:
http://stackoverflow.com/questions/1789627/how-to-change-the-timeout-on-a-net-webclient-object

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)