ответы могут сработать, но вы должны отключить прослушиватель событий от события Tick, когда вам больше не нужен таймер. Я не доверяю обработчику событий и сборщику мусора;)
Я полагаю, что у этого замечательного подкласса DispatcherTimer есть удобный класс для таймеров одного тика.
public class DispatcherTimeout : DispatcherTimer
{
#region Constructors and Destructors
protected DispatcherTimeout(DispatcherPriority priority)
: base(priority)
{
}
#endregion
#region Public Properties
public Action<DispatcherTimeout> Callback { get; set; }
#endregion
#region Public Methods and Operators
/// <summary>
/// Instantiates a new DispatcherTimeout and starts it.
/// </summary>
/// <param name="priority">
/// The dispatcher priority used for the timer.
/// </param>
/// <param name="duration">
/// The duration.
/// </param>
/// <param name="callback">
/// The callback which should be called on tick.
/// </param>
/// <returns>
/// An instance of DispatcherTimeout.
/// </returns>
public static DispatcherTimeout Timeout(DispatcherPriority priority, TimeSpan duration, Action<DispatcherTimeout> callback)
{
var dispatcherTimeout = new DispatcherTimeout(priority);
dispatcherTimeout.Interval = duration;
dispatcherTimeout.Callback = callback;
dispatcherTimeout.Tick += dispatcherTimeout.HandleTick;
dispatcherTimeout.Start();
return dispatcherTimeout;
}
#endregion
#region Methods
private void HandleTick(object sender, EventArgs e)
{
this.Stop();
this.Tick -= this.HandleTick;
if (this.Callback != null)
{
this.Callback(this);
}
}
#endregion
}
Пример:
DispatcherTimeout.Timeout(
DispatcherPriority.Normal,
TimeSpan.FromSeconds(2.0),
timeout =>
{
this.Visibility = System.Windows.Visibility.Visible;
});