Ich denke, was Sie haben, ist ziemlich gut Scott.
Das einzige kleine Problem, das einige damit haben könnten, ist, dass Sie einen Thread blockieren, um Ihre Verzögerung auszuführen. Natürlich ist es ein Hintergrund-Thread und es ist unwahrscheinlich, dass es Probleme verursacht, es sei denn, Sie führen viele dieser Aufrufe gleichzeitig aus (jeder bindet einen Thread), aber es ist immer noch wahrscheinlich suboptimal.
Ich würde stattdessen vorschlagen, dass Sie den Algorithmus in eine Hilfsmethode Faktor und vermeiden, Thread.Sleep zu verwenden.
Es gibt offensichtlich wohl unzählige Möglichkeiten, dies zu tun, aber man hier:
public static class UICallbackTimer
{
public static void DelayExecution(TimeSpan delay, Action action)
{
System.Threading.Timer timer = null;
SynchronizationContext context = SynchronizationContext.Current;
timer = new System.Threading.Timer(
(ignore) =>
{
timer.Dispose();
context.Post(ignore2 => action(), null);
}, null, delay, TimeSpan.FromMilliseconds(-1));
}
}
zu benutzen:
UICallbackTimer.DelayExecution(TimeSpan.FromSeconds(1),
() => textBlock.Text="Done");
Natürlich könnte man auch eine Implementierung dieses DelayExecution Methode schreiben, die andere Arten verwendet B. der WPF DispatcherTimer oder die WinForms Timer-Klasse. Ich bin nicht sicher, was die Kompromisse dieser verschiedenen Timer sein würden. Meine Vermutung wäre, dass die Timer von DispatcherTimer und WinForm tatsächlich auf Anwendungen des entgegengesetzten Typs funktionieren würden.
EDIT:
Re-Lektüre meine Antwort, ich glaube eigentlich würde ich dies in eine Erweiterung Methode versucht sein, Faktor, die auf Synchronisationskontexten funktioniert - wenn man darüber nachdenkt, eine allgemeinere Aussage wäre Sie müssen in der Lage sein, die Arbeit nach einer bestimmten Verzögerung in einen Synchronisationskontext zurückzuschreiben.
Der SynchronizationContext verfügt bereits über eine Post-Methode für Warteschlangen, die der ursprüngliche Aufrufer nach Abschluss nicht blockieren möchte.Was wir brauchen, ist eine Version davon, dass die Arbeit nach einer Verzögerung postet, so statt:
public static class SyncContextExtensions
{
public static void Post(this SynchronizationContext context, TimeSpan delay, Action action)
{
System.Threading.Timer timer = null;
timer = new System.Threading.Timer(
(ignore) =>
{
timer.Dispose();
context.Post(ignore2 => action(), null);
}, null, delay, TimeSpan.FromMilliseconds(-1));
}
}
und Verwendung:
SynchronizationContext.Current.Post(TimeSpan.FromSeconds(1),
() => textBlock.Text="Done");
Wenn Sie mit WPF verwenden [DispatcherTimer] (http: // msdn .microsoft.com/de-us/library/system.windows.threading.dispatchertimer.aspx) –