2016-06-30 10 views
0

Ich versuche, eine grundlegende Verbindung zu Azure ServiceBus einzurichten und habe etwas ungewöhnliches in Azures Beispielcode gefunden, die mich über die Speicherung von Variablen aufgewühlt haben, denn ich kann das nicht zum Laufen bringen.Variablen in einer ereignisgesteuerten Nachrichtenpumpe speichern?

Ein Beispiel, das funktioniert:

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

Wenn ich das in etwa wie folgt bearbeiten:

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

Es funktioniert nicht mehr. Die Ausgabe wird nur "test:" sein. Sollte das nicht so funktionieren oder habe ich etwas verpasst?

Vielen Dank im Voraus

+0

'OnMessage' asynchron ist,' Console.WriteLine' muss innerhalb der Lambda-Ausdruck sein, wie 'Console.WriteLine' ausgeführt wird, bevor OnMessage vorbelegt wird. – Jim

+0

Ich verstehe, das erklärt es. Vielen Dank. Was aber, wenn man die Daten für die weitere Verwendung speichern möchte? – DaveLar

+0

Ich habe meine Antwort bearbeitet ... – Jim

Antwort

1

Ihr Problem ist, dass OnMessage ein Ereignis ist. Der Lambda-Ausdruck message => ... wird ausgeführt, wenn eine Nachricht eintrifft.

// 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

Danke, mein Herr! Wenn ich wirklich benötigte, dass die letzte Zeile eine Nachricht enthielt, konnte ich einen Schlaf verwenden? – DaveLar

+0

Danke, ich verstehe jetzt. Zu dir, mein Freund. Will dies als Lösung so schnell wie ich kann verwenden – DaveLar

+0

@DaveLar - Schlaf wird Ihnen nicht helfen, da Sie nicht wissen, wann eine Nachricht kommen wird. So kann es rechtzeitig für 'test' kommen, wenn Sie geändert wurden Die letzte Zeile wird ausgeführt, kann aber später auch kommen. Wenn Sie weitere Erläuterungen wünschen, erstellen Sie eine weitere Frage und vergessen Sie nicht, eine Antwort auszuwählen, wenn sie Ihnen geholfen hat. – Shade

Verwandte Themen