システムへの着信ユーザー要求が処理されるプロセスがあります。また、メインプロセスの応答性に影響を与えずに、要求に関するメタデータをデータベーステーブルに追加したいと考えています。これを実現するために私はこのような非同期メソッドの呼び出しを追加しました:非同期メソッドが完全に実行されていないようです
public static ReturnObject ResponsiveMethod(string ip, string code)
{
// ... some reasonably quick code
IPDetail.InsertAsync(ip); // <-- call to the async method
return new ReturnObject(code);
}
InsertAsync()メソッドは次のようになります。
public static void InsertAsync(string ipAddress)
{
Action action =() => IPDetail.Insert(ipAddress);
action.BeginInvoke(aResult => Log.Debug("Completed Insert"), null);
}
とを最後に、挿入と呼ばれる通常は非非同期メソッド() :
private static void Insert(string ipAddress)
{
ApplicationContextHelper.LoadApplicationContext();
var helper = new GeoLocationHelper();
var result = helper.GetDetailsFromIP(ipAddress);
Log.InfoFormat("Succesfully retreived IP data {0}.", ipAddress);
result.Save();
}
私のユニットテストでは、InsertAsync()呼び出しが完全に機能します。 Insert()のメソッド呼び出しの中には、ロギングによって詳細が示される多くの操作があり、予想されるすべてのログメッセージがそこにあり、result.Save()メソッドの最終結果もそこにあります。
しかし、上記のResponsiveMethod()メソッドのようなものを利用するWebサービスがあり、何らかの理由で非同期呼び出しが完了しない場合があります。 LoadApplicationContext()メソッドのすべてのログは起動されますが、その後はInsert()に関連するログアクティビティはなく、result.Save()は決して実行されません。
は私の現在の考え方は、Webサービスがそのタスクを完了していないと非同期を呼び出したスレッドがもう存在しないということである
より簡潔であることを要約質問を改訂します。これで非同期呼び出しが完了しなくなるのでしょうか?
このシナリオでは、どのようにEndInvokeを配置するのか正確にはわかりません。私はLinqを使ってコールバックを実行していますが、これは一般的にうまくいきます(私の単体テストでは確実です)。これは、私がコールバックについてあまり気にすることができない場合です...私はちょうど呼び出し元のプロセスをブロックすることなく、新しいことをしたいと思っています。 –
あなたはEndInvokeが何をしたのか分からないので、あなたがそれを必要としているかどうかを知ることはできません。私はあなたが理解していない問題を同時に持ち、理解されていない2つの事柄の間に関連性があるかもしれないことを示唆しています。 –
MSDNのドキュメントでは、「どのテクニックを使用していても、常にEndInvokeを呼び出して非同期呼び出しを完了してください」と言っています。 http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx あなたが見ている問題と関連しているかどうかは分かりませんが、 – Clyde