На данный вопрос уже ответили:
Увеличить скорость парсера
1 ответ
Пытаюсь сделать множество асинхронных запросов HttpWebRequest. Подготовил мини тест:
class Program
{
static void Main(string[] args)
{
Test();
Console.ReadLine();
}
public static async void Test()
{
for (int i = 0; i < 10; i++)
{
int val = i;
await Task.Run(() => WR(val));
}
}
static async void WR(int msg)
{
Console.WriteLine(msg + " begin");
string url = "https://stackoverflow.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
var response = (HttpWebResponse)await Task.Factory.FromAsync
Console.WriteLine(msg + " status code: " + response.StatusCode);
Console.WriteLine(msg + " end");
}
}
Но вот что получилось:
0 begin
1 begin
2 begin
3 begin
4 begin
5 begin
6 begin
7 begin
8 begin
9 begin
0 status code: OK
0 end
1 status code: OK
1 end
А после 1 end вообще ничего не происходит. Где-то через 30 секунд в output вылазит:
The thread 0x6634 has exited with code 0 (0x0).
The thread 0x5620 has exited with code 0 (0x0).
The thread 0x4d08 has exited with code 0 (0x0).
The thread 0x39b8 has exited with code 0 (0x0).
The thread 0x3454 has exited with code 0 (0x0).
The thread 0x99c has exited with code 0 (0x0).
The thread 0x6be0 has exited with code 0 (0x0).
Но никаких ошибок в дебаге не вываливается. Подскажите где я ошибся и как исправить?
UPDATE:
Затык происходит при запуске в Visual Studio. Интересно что с включенным Fiddler все работает нормально.
Ответ
Переписал немного ваш код. Все прекрасно работает
void Main()
{
Test();
Console.ReadLine();
}
public static async Task Test()
{
var tasks = new List
static async Task WR(int msg)
{
Console.WriteLine(msg + " begin");
string url = "https://stackoverflow.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
var response = (HttpWebResponse)await Task.Factory.FromAsync
Console.WriteLine(msg + " status code: " + response.StatusCode);
Console.WriteLine(msg + " end");
response.Dispose();
}
Вывод
0 begin
1 begin
2 begin
3 begin
4 begin
5 begin
6 begin
7 begin
8 begin
9 begin
3 status code: OK
3 end
5 status code: OK
5 end
0 status code: OK
0 end
6 status code: OK
6 end
2 status code: OK
2 end
7 status code: OK
7 end
1 status code: OK
1 end
8 status code: OK
8 end
9 status code: OK
9 end
4 status code: OK
4 end
UPD
Не забываем диспозить респонс
static async Task WR(int msg)
{
Console.WriteLine(msg + " begin");
string url = "https://stackoverflow.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
using (var response = (HttpWebResponse)
await Task.Factory
.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)) //// <<<<<
{
Console.WriteLine(msg + " status code: " + response.StatusCode);
Console.WriteLine(msg + " end");
}
}
Комментариев нет:
Отправить комментарий