Winforms相当于javascript setTimeout

dav*_*eps 10 .net javascript settimeout winforms

是否有一个简单的解决方案/想法/策略来在WinForms应用程序中创建一个setTimeout等效函数.我主要是一个Web开发人员,但我不确定如何在WinForms应用程序中进行此操作.基本上,我有一个文本框,每次击键后我想运行一个任务来填充一个列表(比如一个自动完成类型的东西),但是如果用户继续输入字符,希望能够取消(例如clearTimeout)...

我唯一的猜测是可能使用BackGroundWorker并使其初始睡眠,当它处于休眠状态时,它可以被取消,如果用户停止输入键并且睡眠期结束,则它会运行任务等

(我不在乎一个例子是C#还是Vb.Net)

Rob*_*ert 30

我知道这是一个古老的问题,但另一种解决方案是使用Task.Delay(delay).ContinueWith((task) => { /* Code */ });.

Thread.Sleep vs Task.Delay?

或者有 await Task.Delay(delay);

https://social.msdn.microsoft.com/Forums/vstudio/en-US/345f0402-3af0-4f96-a501-073674883ba3/building-an-async-settimeout-function?forum=csharpgeneral

  • 从那时起,事情已经取得了长足的进步……感谢您发布答案! (2认同)

Ser*_*uei 13

您可以使用System.Timers.Timer:将AutoReset设置为false并使用Start/Stop方法并为Elapsed事件创建处理程序.


小智 10

    public void setTimeout(Action TheAction, int Timeout)
    {
        Thread t = new Thread(
            () =>
            {
                Thread.Sleep(Timeout);
                TheAction.Invoke();
            }
        );
        t.Start();
    }
Run Code Online (Sandbox Code Playgroud)

  • 我不建议使用这种方法.仅针对单个操作创建整个线程?矫枉过正.使用其他方法中提供的Timer类可以获得更高产量的东西.根据这个答案,为每个新线程分配1 MB内存.http://stackoverflow.com/a/2744464/881111 - 请记住,OP说每次击键后他都要运行这个...所以考虑1 MB的内存和每次击键的新线​​程.馊主意. (4认同)

小智 9

定时器实现:

public void SetTimeout(Action action, int timeout)
{
    var timer = new System.Windows.Forms.Timer();
    timer.Interval = timeout;
    timer.Tick += delegate (object sender, EventArgs args)
    {
        action();
        timer.Stop();
    };
    timer.Start();
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我可以提出以下建议

internal class Timeout : System.Timers.Timer
{
    public Timeout (Action action, double delay)
    {
        this.AutoReset = false;
        this.Interval = delay;
        this.Elapsed += (sender, args) => action();
        this.Start();
    }
}
// Example
var timeout = new Timeout(() => {
    Console.WriteLine("init 1");
}, 500);
timeout.Stop();
Run Code Online (Sandbox Code Playgroud)