2010-12-01 4 views
1

Ich habe eine Situation, in der ich einem Benutzer in eine WPF-TextBox eingeben kann, bei jedem Tastendruck OnPropertyChanged und Push an meine Bindungsquelle (mit SourceUpdatedTrigger = PropertyChanged) möchte ich dort eine kurze Verzögerung sein, bevor Sie versuchen, die Daten zu verarbeiten (sagen wir ... 1 Sekunde) Stellen Sie sich das wie ein Rechtschreibprüfungssystem vor, wo es darauf wartet, dass der Benutzer mit dem Tippen aufhört, bevor er ihnen sagt, dass sie nicht buchstabieren können.Implementieren einer verzögerten Ausführungstask mit Abbruch

Mein Problem ist:

await TaskEx.Delay(1000, cts.Token); 
await TaskEx.RunEx(PollAsync, cts.Token); 

funktioniert gut, bis Sie tatsächlich kündigen, aber dann die Abbruch-Token Quelle permanantly in der „Abbruch angefordert“ Zustand, und ich habe die CTS reinstanciate ... das scheint ... grundsätzlich falsch ... Gibt es einen besseren Weg, um den CTS "zurückzusetzen" und trotzdem vorhandene Token zu benachrichtigen, die sie löschen sollten?

Antwort

2

Nein, ein CancellationTokenSource kann nur einmal abgebrochen werden - wie Sie sagen, müssen Sie einen neuen erstellen, nachdem Sie ihn für weitere Aufgaben abgebrochen haben.

+0

Gibt es eine bessere "Best Practice" für verzögerte Startverarbeitung wie diese? – Firoso

+0

@Firoso: Nicht, dass ich mir dessen bewusst bin. Ich bin mir nicht sicher, ob das Abbrechen der Aufgabe hier der beste Weg ist - vielleicht mach es einfach nicht nötig, es zu verarbeiten, wenn es vorher einen anderen Tastenanschlag gab ... behalte eine Art "Versionszähler" oder etwas ähnliches? Nicht sicher. –

+0

@JonSkeet Hallo. Würden Sie bitte [diese Frage] (http://stackoverflow.com/questions/17082827/error-the-operation-was-canceled) sehen? Danke im Voraus –

Verwandte Themen