2009-03-11 7 views
3

boolを返すメソッドを呼び出すにはどうすればよいですか?boolの値を判断するには、そのメソッドは非同期的にWebサービスを呼び出しますか?メソッドを呼び出して戻り値を待つ

bool myBool = GetABoolean(5);  

public bool GetABoolean(int id) 
{ 

    bool aBool; 

    client.CallAnAsyncMethod(id); // value is returned in a completed event handler. Need to somehow get that value into aBool. 

    return aBool; // this needs to NOT execute until aBool has a value 

} 

は、だから私は必要なものCallAnAsyncMethodが完了し、呼び出し元のメソッドにブール値を返す前に値を返したまで待機するGetABoolean方法があります。

私はこれを行う方法がわかりません。

+0

これは、asyncを呼び出すPOINT全体です。結果を待つ必要はありません.... 結果が必要な場合は、同期を呼び出すだけです。 –

+0

あなたのコントロールから外れている非同期呼び出しの理由はありますか?もしそうでなければ、マークはオンポイントです。過度に複雑化しないでください(私のひどく複雑すぎる例を参照してください)。 –

+0

これはSilverightへのポート用です。さもなければ、私の電話は同期したままになり、私はもっと幸せになるでしょう! – ScottG

答えて

3

Webメソッドを同期して呼び出すことはできますか?

+1

Silverlightではありません;) –

9

ほとんどの非同期メソッドは、IAsyncResultを返します。

場合は、IAsyncResult.AsyncWaitHandleを使用して、操作が完了するまでブロックする(IAsyncResult.AsyncWaitHandle.WaitOne)ブロックすることができます。

すなわち:

 
bool aBool;

IAsyncResult res = client.CallAnAsyncMethod(id); res.AsyncWaitHandle.WaitOne(); // Do something here that computes a valid value for aBool! return aBool;

4

同期メソッドを呼び出す、またはそれのためCallAnAsyncMethodCompletedイベントハンドラを追加し、戻り値で動作するようにe.Resultオブジェクトを使用しますか。

2

これは少なくとも最近3回目ですが、私はこの種の質問を見たので、いくつかの質問をします(OPに対する回答は明白です)。

なぜWebサービスを非同期に呼び出すことを検討していますか?パフォーマンス?ワーカースレッドをブロックしませんか?

非同期Webサービスコールを使用する例がありますか?もしそうなら、あなたはこの例のURLを投稿できますか?

お時間をいただきありがとうございます。これらの質問に対するあなたの答えは、他の人に答えるのに役立ちます。


この質問に「silverlight」というタグが追加されました。今後、Silverlightの質問についても同じことをお勧めします。これは、すべての "ブロッキング"呼び出しが非同期でなければならないというコンテキストを作成します。

今、SilverLightのエキスパートが答えなければならないが、私はあなたが間違った方法でこれをやっていると思う。コールの非同期性が失われています。あなたのGetABooleanメソッドは非同期でなければならず、答えが得られるまで返るべきではないと思います。

+0

私はこのWPFコードをSilverlightに移植しようとしていますが、非同期呼び出しの呼び出しが必要です – ScottG

+0

入力いただきありがとうございます。私は値を返すメソッドを持っているこのようなコードをたくさん持っています。そのメソッドの内部でサービスコールを行います。以前はその呼び出しは同期でした。私は今それを非同期にする必要がありますが、サービス呼び出しが戻るまでそのメソッドに座る必要があります。 – ScottG

+0

もう一度、「いいえ、あなたはしません」。呼び出しメソッドを非同期にして、それに座る必要はありません。 –

0

CallAnAsyncMethodの呼び出しとリターンの間にコードがさらにある場合は、非同期で実行する可能性があります(不要な事前最適化の可能性があります)。そうでない場合はコードを同期します。

このコードを非同期的に実行するアーキテクチャを制御できない場合は、完了を待つために変数とループを監視する必要があります。

bool myBool; 
bool retrievingMyBool; 
RetrieveABoolean(5);  

public bool RetrieveABoolean(int id) 
{ 
    client.CallAnAsyncMethod(id); // value is returned in a completed event handler. Need to somehow get that value into aBool. 
    retrievingMyBool = true; 
    while (retrievingMyBool) 
    { 
     Thread.Sleep(100); 
    } 
} 

private void completedEventHandler([[parameters go here]]) 
{ 
    // code to handle parameters 
    myBool = // whatever 
    retrievingMyBool = false  
} 

これはあなたがスレッドセーフであるとするが、ハックのように、それは仕事ができるコードが必要場合は特に、恐ろしいソリューションであり、将来的にあなたの巨大な頭痛の原因となります。

関連する問題