データ ソースから情報を読み取り、この情報を単純なコントローラーを備えた .NET 4.5 Web API サイトである Web サイトにプッシュする小さな .Net 4.5 C# アプリがあります。コントローラーはデータを受け取り、それをデータベースに入れます。
アプリケーションが読み取ることができるのと同じくらい速く、それを書き込むことができ、すべてが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());
}
}
以下は機能しません。約 1,000 件のレコードを POST し、「タスクがキャンセルされました」というメッセージとともに多数のエラーが発生しますが、約 10 秒後に処理を再開します。
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());
}
}
完全なエラーは次のとおりです。
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
これに対する簡単な修正はありますか?私が言えることから、何か、スレッド、ソケットが不足していることがわかります:-)
POSTを同期的に実行すると非同期よりもかなり遅いことが想像できるので、これを機能させたいと思います。
私のマシン、ローカル アンチウイルス、またはネットワークではないことを確認するために、W2k8 R2 サーバー、Windows 7 仮想ゲスト デスクトップ (フレッシュ ビルド)、および Windows 8 マシンでも同じ結果が得られました。
詳細情報: これをテストしましたが、データ セットが小さい (10,000 レコード)、DefaultConnectionLimit が 100 の LAN 接続で部分的な成功を収めました。レイテンシー 25ms-50ms) 私は成功していません。
助けてくれてありがとう:-)