WebClient не всегда работает?
От: yniker  
Дата: 23.03.13 09:18
Оценка:
Вот такой пример запускаем 100 Task. для загрузки html. c одного сайта,
в синхронной версии программа работает в асинхронной не завершается?
Всегда остается 10-15 ждущих?
Почему?

Запускаем

  private void button2_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 100; i++)
            {

                Task.Factory.StartNew(
                    () =>
                        {
                          DoLongWork();
                        }

                    );
            }

        }



    private Object thisLock = new Object();

       void DoLongWork()
        {

            lock (thisLock)
            {
                count_start++;
            }

            var wc = new WebClient();

           

            //Вариант №1
            Variant1(wc);

            //Вариант №2
           // Variant2(wc);

        }


        void Variant1(WebClient wc)
        {
            wc.DownloadStringCompleted += (s, e) =>
            {
                lock (thisLock)
                {
                    count_end++;
                }

            };    

            wc.DownloadStringAsync(new Uri("http://www.yandex.ru")); 
        }

        void Variant2(WebClient wc)
        {
            try
            {
                wc.DownloadString(new Uri("http://www.yandex.ru"));
            }
            catch (WebException exp)
            { }

            lock (thisLock)
            {
                count_end++;
            }

        }


По таймеру просматриваем

private void timer1_Tick(object sender, EventArgs e)
        {
            Text = String.Format("Count Threads={0}, Count_Start={1},Count_end={2}",
                                 Process.GetCurrentProcess().Threads.Count,             
                                 count_start, count_end
                                 );              

        }



count_end — не доходит до 100 в асинхронной версии?
Какие могут быть причины?
1. Что-то не так в коде с lock!
2. У DownloadStringCompleted — нет таймаута по умолчанию?
3?

Спасибо за любой совет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.