Вот такой пример запускаем 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?
Спасибо за любой совет.