Asynchroniczne ograniczenia .NET HTTPClient
Mam niewielką aplikację .Net 4.5 C #, która odczytuje informacje ze źródła danych, a następnie przesyła te informacje do strony internetowej, która jest witryną .NET 4.5 Web API z prostym kontrolerem. Kontroler odbiera dane i umieszcza je w bazie danych.
Poniższe działa dla mnie tak szybko, jak aplikacja może odczytać, może pisać i wszystko kończy się w DB:
public static void PostDataToWebApi(MyDataClass tData)
{
HttpResponseMessage s = null;
try
{
s = client.PostAsJsonAsync("/api/Station/Collector", tData).Result;
s.EnsureSuccessStatusCode();
}
catch (Exception e)
{
Console.WriteLine("ERROR (ClientPost): " + e.ToString());
}
}
Poniższe nie działa. POSTA około tysiąca nieparzystych rekordów, a następnie pojawia się szereg błędów z komunikatem „zadanie zostało anulowane”, ale po około 10 sekundach wznawia przetwarzanie:
public static async void PostDataToWebApi(MyDataClass tData)
{
HttpResponseMessage s = null;
try
{
s = await client.PostAsJsonAsync("/api/Station/Collector", tData);
s.EnsureSuccessStatusCode();
}
catch (Exception e)
{
Console.WriteLine("ERROR (ClientPost): " + e.ToString());
}
}
Pełny błąd to:
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at IICE_DataCollector_Remote.Program.<PostDataToWebApi>d__7.MoveNext() in e:\Users\TestUser.TEST\Documents\Visual Studio 2012\Projects\Test_App-trunk\TestCollector\Program.cs:line 475
Jakieś szybkie poprawki? Z tego co wiem, zabrakło czegoś, wątków, gniazd, kto wie :-)
Wszelkie wskaźniki byłyby mile widziane, bardzo chciałbym, aby to działało, jak można sobie wyobrazić, wykonanie POST synchronicznie jest znacznie wolniejsze niż asynchronicznie.
Aby mieć pewność, że nie był to mój komputer, lokalny program antywirusowy lub sieć, którą próbowałem na serwerze W2k8 R2, wirtualny pulpit gościa Windows 7 (nowa kompilacja) i komputer z systemem Windows 8, z takim samym wynikiem.
Więcej informacji : Przetestowałem to z częściowym sukcesem z połączenia LAN z mniejszym zestawem danych (10 000 rekordów) i DefaultConnectionLimit równym 100. Jednak w produkcji z 500 000 rekordów podczas wysyłania na zdalny serwer przez Internet (wciąż małe opóźnienie 25 ms -50ms) Nie odniosłem żadnego sukcesu.
Z góry dziękuję za wszelką pomoc :-)