2016-06-23 17 views
0

ich die folgende Klasse haben, die eine Nachricht auf aws sns Warteschlangen „TryRestart()“ veröffentlicht:Verzögerung basierend auf Ereignissen

internal class SmsReceptionTestRunner : ITestRunner<ConfigurationViaSmsAttempt> 
{ 
    private readonly CommunicationClient _communicationClient; 

    public SmsReceptionTestRunner(CommunicationClient communicationClient) 
    { 
     _communicationClient = communicationClient; 
    } 

    public Test Execute(ConfigurationViaSmsAttempt MessageType) 
    { 
     // publish 
     _communicationClient.ConfigurationService.TryRestart(MessageType.Imei); 

     // wait five minutes ...  

     return new Test("6", "", false, MessageType.TargetApn, MessageType.TargetApn); 
    } 
} 

Eine separate Handler-Klasse Pflege der Antwort nimmt, wenn es auf den Warteschlangen veröffentlicht wird - in der Regel Das dauert etwa fünf Minuten - await Task.Delay(TimeSpan.FromMinutes(5));. Nach den 5 min. wenn keine Nachrichten behandelt wurden gespeichert ich ein neues Test-Set auf false .:

public class RestartViaSmsAttemptHandler : IHandler<RestartViaSmsAttempt> 
{ 
    private readonly IRepository<Test> _TestRepository; 

    public RestartViaSmsAttemptHandler(IRepository<Test> TestRepository) 
    { 
     _TestRepository = TestRepository; 
    } 

    public bool Handle(RestartViaSmsAttempt message) 
    { 
     var test = new Test("6", message.Imei, true, "", ""); 
     _TestRepository.Save(test); 
     return true; 
    } 
} 

ich einen Mechanismus platzieren will die // wait five minutes Bit verhindern nur, wenn mein Handler bekommt eine Nachricht zurück aus den Warteschlangen zu laufen.

Im Grunde frage ich nach etwas zum Neustart und nach 5 Minuten, wenn es keine Antwort gibt, weiß ich, dass etwas schiefgelaufen ist.

+0

Die Problembeschreibung ist nicht klar. Möchten Sie die Wartezeit von 5 Minuten vorzeitig abbrechen, wenn eine Nachricht eintrifft? Hast du schon etwas probiert? – usr

+0

Ich habe es versucht, indem ich 'aware Task.Delay (TimeSpan.FromMinutes (5));' Überprüfen Sie dann, ob der Test gespeichert wurde, aber ich mag diese Lösung nicht. Ich denke, ich müsste die 5 Minuten irgendwie abbrechen. Ich suche hier ein besseres Design – Rober

Antwort

0

Sie können eine Warte früh wie dieser abbrechen:

await Task.WhenAll(someTask, TimeSpan.FromMinutes(5)); 

Wenn someTask die Enden Warte abgeschlossen wird. Mit TaskCompletionSource können Sie eine Aufgabe erstellen, die nach Belieben abgeschlossen werden kann.

Wenn Sie also eine Antwort erhalten, beenden Sie die Aufgabe und beenden Sie die Wartezeit.

Sind Sie sicher, dass Sie Nachrichtenwarteschlangen benötigen? Sie führen grundsätzlich einen synchronen Aufruf über eine Nachrichtenwarteschlange aus. Vielleicht genügt ein normaler Web-Service-Anruf.

+0

Die Kommunikation mit dem Gerät, das neu gestartet wird, erfolgt über aws sns. Es gibt keine Aufgabe, die abgeschlossen werden muss, sondern nur eine ungefähre Antwortzeit für das Gerät, die fünf Minuten beantwortet werden muss. Diese Antwort wird vom Handler verwaltet. – Rober

+0

'Ich denke, ich müsste die 5 Minuten irgendwie abbrechen. Ich habe dir gesagt, wie man das macht. Sie erstellen die Aufgabe * selbst * und vervollständigen sie, wenn Sie die Wartezeit abbrechen möchten. Funktioniert das für dich? – usr

+0

Insbesondere bin ich verwirrt von Ihnen sagen, dass es keine Aufgabe gibt, wenn meine gesamte Antwort darauf konzentriert ist, eine zu erstellen. – usr

Verwandte Themen