2009-06-18 21 views
0

システムへの着信ユーザー要求が処理されるプロセスがあります。また、メインプロセスの応答性に影響を与えずに、要求に関するメタデータをデータベーステーブルに追加したいと考えています。これを実現するために私はこのような非同期メソッドの呼び出しを追加しました:非同期メソッドが完全に実行されていないようです

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サービスがそのタスクを完了していないと非同期を呼び出したスレッドがもう存在しないということである

より簡潔であることを要約質問を改訂します。これで非同期呼び出しが完了しなくなるのでしょうか?

答えて

1

私はこれまでにBeginInvokeを使ったことがありませんでしたが、通常Begin *がある場所では、対応するEnd *も必要です。正しい例外処理とともに、1つを追加してください。

+0

このシナリオでは、どのようにEndInvokeを配置するのか正確にはわかりません。私はLinqを使ってコールバックを実行していますが、これは一般的にうまくいきます(私の単体テストでは確実です)。これは、私がコールバックについてあまり気にすることができない場合です...私はちょうど呼び出し元のプロセスをブロックすることなく、新しいことをしたいと思っています。 –

+0

あなたはEndInvokeが何をしたのか分からないので、あなたがそれを必要としているかどうかを知ることはできません。私はあなたが理解していない問題を同時に持ち、理解されていない2つの事柄の間に関連性があるかもしれないことを示唆しています。 –

+0

MSDNのドキュメントでは、「どのテクニックを使用していても、常にEndInvokeを呼び出して非同期呼び出しを完了してください」と言っています。 http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx あなたが見ている問題と関連しているかどうかは分かりませんが、 – Clyde

0

私の最初の考えは、何らかの理由でWebサービスシナリオで非同期呼び出しで例外をスローしている可能性があるということです。私はおそらくそれをウェブ上に投稿するためにそれを守ってきたことは知っていますが、そこには多かれ少なかれ不具合のエラー処理コードがありますか?

+0

例外はいくつかありますが、処理されやすく、最悪の場合、詳細なログメッセージが表示されます。 –

+0

OK。非同期呼び出しはThreadPoolスレッド上になければならないので、元のスレッドが終了して終了するかどうかは関係ありません。 – Clyde

0

Asyncメソッド呼び出しで呼び出し元のIDに頼っていますか?アイデンティティは、Webサービスから呼び出されたときに失われる可能性があります。

+0

私はアイデンティティをかなり使う傾向があるので、良い質問です。しかし、私はこれがここに当てはまるとは思わない。ログトレイルは、アイデンティティが使用される可能性のある領域の前で停止します。問題が発生した場合は、例外が発生し、ログに記録されます。 –

関連する問題