2009-03-09 7 views
0

古典的なASP.NETで私は、基本クラスのプロパティでは、Webサービスから抽出されたデータを永続化したい:は、プロパティを永続化 - 次のように非同期

private string m_stringData; 
    public string _stringData 
    { get { 
      if (m_stringData==null) 
       { 
        //fetch data from my web service 
        m_stringData = ws.FetchData() 
       } 
      return m_stringData; 
     } 
    } 

私は単に_stringDataへの参照を作成していることを知ることができ、この方法では、私はいつも私がしていたデータを取得していました(たぶん時にはプライベートメンバ変数ではなくストアとしてセッション状態を使用することがあります)。

SilverlightでWCFを使用する場合、永続化メカニズムとしてIsolated Storageを使用することもできますが、WCFサービスを非同期に呼び出す必要があるため、サービスコールをこのように行うことはできません。

1つの方法でサービスコールを呼び出して応答を取得するにはどうすればよいですか?

おかげで、あなたの方法で マーク

答えて

0

は、非同期サービスコールを呼び出し、フラグを設定するコールバックを登録します。メソッドを呼び出したら、データが返されたことを示すフラグが設定されるまで、フラグを定期的にチェックするビジー/ウェイトループを入力します。コールバックは、メソッドのバッキングフィールドを設定する必要があり、成功を示すフラグが設定されたことを検出するとすぐにそれを返すことができます。あなたはまた、失敗を心配する必要があります。異なるスレッドからメソッドへの複数の呼び出しを取得できる場合は、コードをスレッドセーフにするためにいくつかのロックを使用する必要があります。

EDIT

実は、忙しい/ WebサービスがBeginGetData/EndGetDataのセマンティクスをサポートしている場合、ループは、おそらく行く方法ではありません待ちます。私は似たようなことをするコードをいくつか見ていて、WaitOneを使って単純に非同期の結果を待ってから取り出します。あなたのWebサービスがこれをサポートしていない場合、他のプロセスが実行する時間を与えるために、待機ループにThread.Sleep(例えば50-100ms)を投げます。私のコードから

例:あなたの助けのためのtvanfosson

IAsyncResult asyncResult = null; 
try 
{ 
    asyncResult = _webService.BeginGetData(searchCriteria, null, null); 
    if (asyncResult.AsyncWaitHandle.WaitOne(_timeOut, false)) 
    { 
     result = _webService.EndGetData(asyncResult); 
    } 
} 
catch (WebException e) 
{ 
    ...log the error, clean up... 
} 
+0

私はこれまでに試してみましたが、私の待機ループ(do {// stuff} while(blnWaiting == true)}はスレッドをロックしていたので、フラグは決して設定されませんでした。私はこの「コメント」で300文字に制限されているので、完全なコードを表示することはできません。ありがとう、マーク –

+0

私は実際にそれを行う方法からの例を追加しました - これは私が記述したものとは異なります。 Webサービスによっては適用される場合とされない場合があります。 – tvanfosson

+0

はい、これは私が必要としているようです。私はそれを実装し、私がどのように行くかを見ていきます。ご協力いただきありがとうございます。 –

0

感謝。私はあなたのコードを踏襲しても、正確にラムダ式を使用して自分のニーズを満たしている擬似同様のソリューションを発見した:

private string m_stringData; 
public string _stringData{  
get 
    { 
    //if we don't have a list of departments, fetch from WCF 
     if (m_stringData == null) 
     { 
      StringServiceClient client = new StringServiceClient(); 
      client.GetStringCompleted += 
       (sender, e) => 
       { 
        m_stringData = e.Result; 
       }; 
      client.GetStringAsync(); 
     } 
     return m_stringData; 
    } 
} 

EDIT

おっと...実際に、これはどちらか:-(動作しませんが 私は呼び出しを非同期で行い、MVVMパターンとより多くのバインディングを使用するプログラミングロジックを変更しました。

関連する問題