Limitações assíncronas do .NET HTTPClient
Eu tenho um pequeno aplicativo .Net 4.5 C # que lê informações de uma fonte de dados e, em seguida, envia essas informações para um site da Web que é um site de API da Web do .NET 4.5 com um controlador simples. O controlador recebe os dados e os coloca em um banco de dados.
O seguinte funciona para mim, tão rápido quanto o aplicativo pode lê-lo pode escrever e tudo acaba no banco de dados:
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());
}
}
O seguinte NÃO funciona. Ele publica cerca de um milhar de registros e, em seguida, gera um número de erros, todos com a mensagem "uma tarefa foi cancelada", mas depois de aproximadamente 10 segundos, ela retoma o processamento:
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());
}
}
O erro completo é:
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
Alguma correção rápida para isso? Pelo que eu posso dizer, fica sem algo, roscas, soquetes, quem sabe :-)
Quaisquer ponteiros seriam apreciados, eu adoraria fazer isso funcionar, como você pode imaginar, fazer o POST sincronicamente é consideravelmente mais lento do que de forma assíncrona.
Só para ter certeza de que não era minha máquina, antivírus local ou rede, experimentei um servidor W2k8 R2, uma área de trabalho virtual para convidados do Windows 7 (versão nova) e uma máquina com Windows 8, com o mesmo resultado.
Mais informações : Eu testei isso com sucesso parcial de uma conexão LAN com um conjunto de dados menor (10.000 registros) e um DefaultConnectionLimit de 100. Mas, em produção com 500.000 registros, ao postar em um servidor remoto na Internet (ainda baixa latência 25ms -50ms) Eu não tive nenhum sucesso.
Agradecemos antecipadamente por qualquer ajuda :-)