代码应在短暂延迟后执行一次

tes*_*ing 5 c# timer xamarin.ios ios xamarin

我有这个Timer:

Timer delayTimer = new Timer();
delayTimer.Interval = 500;
delayTimer.Elapsed += (object sender, ElapsedEventArgs e) => {
    Console.WriteLine("test");
    textInputDialog.Show();
    delayTimer.Stop();
};
delayTimer.Start();
Run Code Online (Sandbox Code Playgroud)

这里我有以下问题:

  • 定时器永不停止.代码每500ms执行一次.
  • textInputDialog.Show(); 不起作用(可能导致上述问题)

我的代码出了什么问题?

替代方案:

正如Jens Horstmann所说,这是计时器的替代品.这是在UI线程上调用的:

private async Task SendWithDelay()
{
    await Task.Delay(500);
    textInputDialog.Show();
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是NSTimer:

NSTimer.CreateScheduledTimer(new TimeSpan(0,0,0,0,500), delegate {
    textInputDialog.Show();
});
Run Code Online (Sandbox Code Playgroud)

要调用UI线程上的调用,您可以使用InvokeOnMainThread:

Timer delayTimer = new Timer();
delayTimer.Interval = 500;
delayTimer.Elapsed += (object sender, ElapsedEventArgs e) => {
    delayTimer.Stop();
    Console.WriteLine("test");
    InvokeOnMainThread (() => {
        textInputDialog.Show();
    });
};
delayTimer.Start();
Run Code Online (Sandbox Code Playgroud)

DrK*_*och 4

在显示对话框之前停止计时器:

delayTimer.Elapsed += (object sender, ElapsedEventArgs e) => {
    delayTimer.Stop();
    Console.WriteLine("test");
    textInputDialog.Show();
};
Run Code Online (Sandbox Code Playgroud)

另外,您可能使用了错误的计时器。不要使用System.Threading.Timeror,System.Timers因为这涉及到多线程,它不能很好地与 winforms 或 WPF 配合使用。(这可能是您的 MessageBox 不显示的原因 - 它在错误的线程上调用)

在 WPF 中你应该使用System.Windows.Threading.DispatcherTimer

编辑

在 Winforms 中你应该使用System.Windows.Forms.Timer(见评论)