2016-06-30 9 views
0

AzureのServiceBusへの基本的な接続をセットアップしようとしていて、Azuresサンプルコードに何か不具合がありました。イベントドリブンメッセージポンプに変数を格納していますか?

作品例:

client.OnMessage(message => 
{ 
    Console.WriteLine(String.Format("Message body: {0}", message.GetBody<String>())); 
    Console.WriteLine(String.Format("Message id: {0}", message.MessageId)); 
}); 

を、私はこのような何かにこれを編集する場合:

string test = string.Empty; 
client.OnMessage(message => 
{ 
    test = String.Format("Message body: {0}", message.GetBody<String>()); 
}); 
Console.WriteLine("test: "+test); //outputs "test: " 

それはもう動作しません。出力は "test:"になります。このように動作してはいけないのか、何か逃してしまったのでしょうか?事前に

おかげ

+0

'OnMessage'が非同期である、' Console.WriteLine'はonMessageのが先取りされる前に、 'Console.WriteLine'が実行されるよう、ラムダ式内である必要があります。 – Jim

+0

それはそれを説明しています。ありがとうございました。しかし、後で使用するためにデータを保存する必要がある場合はどうすればよいでしょうか? – DaveLar

+0

私は私の答えを編集しました... – Jim

答えて

1

あなたの問題はOnMessageがイベントであるということです。 ラムダ式message => ...は、メッセージが到着したときに実行されます。

// keep a list if you need one. 
var bag = new ConcurrentBag<string>(); 
// the string is allocated immediately. 
string test = string.Empty; 
// the client will execute the lambda when a message arrives. 
client.OnMessage(message => 
{ 
    // this is executed when a message arrives. 
    test = String.Format("Message body: {0}", message.GetBody<String>()); 

    // this will output the message when a message arrives, and 
    // the lambda expression executes. 
    Console.WriteLine("test: "+test); //outputs "test: " 

    // you could add the message to a list here. 
    bag.Add(message.GetBody<string>()); 
}); 

// this line of code runs immediately, before the message arrives. 
Console.WriteLine("test: "+test); //outputs "test: " 
+0

ありがとうございました!メッセージを入れるのに最後の行が本当に必要な場合は、私は睡眠を使うことができますか? – DaveLar

+0

ありがとう、私は今理解しています。あなたに私の友達Streetcred。私はできるだけ早く解答としてこれを使用します。 – DaveLar

+0

@DaveLar - メッセージがいつ来るのか分からないので、睡眠は助けにならないでしょう。それで 'test'が修正された時に来るかもしれません。最後の行は実行されますが、それよりも後に来るかもしれません。より明確にするには、別の質問を作成し、それがあなたを助けた場合は回答を選択することを忘れないでください。 – Shade

関連する問題