2017-02-22 2 views
0

Ich verwende Implementierung Phase dieser URL how-can-i-read-messages-from-a-queue-in-parallel, es funktioniert gut, wenn ich vorher verwendet habe, nach einiger Zeit funktioniert es nicht, ich weiß nicht ' Verstehst du nicht, was passiert? Nachdem ich Zeit verbracht habe, schließe ich das Programm bei einer bestimmten Methode ab.Task.StartNew.ReceiveAsync() funktioniert nicht richtig beim Empfang von Nachrichten von MSMQ

/// <summary> 
    /// APM -> TAP conversion for MessageQueue.Begin/EndPeek. 
    /// </summary> 
    private static Task<Message> PeekAsync(MessageQueue messageQueue) 
    { 
     return Task.Factory.FromAsync(messageQueue.BeginPeek(), messageQueue.EndPeek); 
    } 

, wenn ich diese Implementierung kommentieren Sie auf RunAsync() Verfahren und ReceiveAsync() Methode

/// <summary> 
    /// APM -> TAP conversion for MessageQueue.Begin/EndReceive. 
    /// </summary> 
    private static Task<Message> ReceiveAsync(MessageQueue messageQueue, TimeSpan timeout) 
    { 
     return Task.Factory.FromAsync(messageQueue.BeginReceive(timeout), messageQueue.EndPeek); 
    } 

dann Programm beenden, gibt Aufruf ist keine Ausnahme, weder irgend etwas geschehen. Einfach Programm ist beendet.

aus meiner Perspektive Task.Factory.FromAsync() ist ein Grund, aber nicht uncertand warum?

Wenn ich die gleiche Warteschlange mit dem Empfang von Nachrichten als BeginReceive() Eventhandler verwende, funktioniert es OK. Wie erkenne ich das?

+0

Sie auf UnhandledException abonnieren können für aktuelle 'AppDomain' – VMAtm

Antwort

0

In der ReceiveAsync-Funktion sollte der zweite Parameter FromAsyncmessageQueue.EndReceive statt messageQueue.EndPeek sein.

+0

u haben Recht, ich habe auch gleiche Sache implementieren, aber nicht funktioniert – Faraz

0

Erste Dinge zuerst.

Wie @xwlantian wies darauf hin. Ihre Vermischung Ihrer APM-Methodenpaare.

Sie sollten Ihre BeginXXX immer mit der korrekten EndXXX Methode übereinstimmen. Andernfalls erhalten Sie eine Ausnahme.

In Ihrem Fall

Task.Factory.FromAsync(messageQueue.BeginReceive(timeout), messageQueue.EndPeek) 

Sollte

Task.Factory.FromAsync(messageQueue.BeginReceive(timeout), messageQueue.EndReceive) 

lesen Sie sollten jedoch diese Texte selbst der Lage gewesen, zu beheben, wenn Sie die richtigen Informationen (die Ausnahme/Stacktrace) hatte. Was Sie behaupten, wurde vermisst.

Dies ist nicht wahr.

Der Grund, warum Sie keine Ausnahme sehen, ist, dass Visual Studio nicht break auf Ihre Ausnahme (das ist die typische Weise, die Sie "finden" Ausnahmen). Stattdessen können Sie Ihre Windows-Ereignisanzeige ansehen, und Sie sollten dort die Ausnahme finden.

Warum haben Sie die Ausnahme nicht "gesehen"?

Die folgenden wahr

  1. Ihre Ausnahme ohne try/catch Paar auf einem Hintergrund-Thread aufgetreten der Stapel nach oben.
  2. Sie hatten keinen Ausnahme-Handler in der AppDomain.
  3. Sie haben "Just My Code" in Ihren "Debugging" -Einstellungen aktiviert.
+0

ich es mit gleichen Paaren auch getestet, aber nicht funktionieren.Ich bin durch Ihre Angaben überprüft später – Faraz

+0

Aber wie testen 'Task.Factory.FromAsync (messageQueue.BeginReceive (Timeout), messageQueue.EndReceive);' wie es ist, neue Aufgabe und es ist Implementierung verborgen ist, mehr über sie verlassen wird wenn der Debugger diese Zeile ausführt. Bitte erläutern Sie – Faraz

+0

Haben Sie einen Blick auf die Ausnahme geworfen, wo ich Ihnen gesagt habe, Sie zu suchen? Meine psychischen Kräfte können mich nur so weit bringen. Geben Sie mir Ihre Ausnahme/Stack-Trace, wenn Sie weitere Hilfe benötigen. – Aron

Verwandte Themen