如何在特定时间间隔后运行方法?

Mos*_*zán 14 c# multithreading timer winforms

很明显:例如,想象一下我的表格中的一个按钮.当用户单击该按钮时,某些void方法应在30秒后运行.

将有一个带有DoAfterDelay两个输入参数的void方法.第一个是要做的方法(使用委托),另一个是时间间隔.所以我会:

public delegate void IVoidDelegate();
static void DoAfterDelay(IVoidDelegate TheMethod, TimeSpan Interval)
    {
        // *** Some code that will pause the process for "Interval".
        TheMethod();
    }
Run Code Online (Sandbox Code Playgroud)

所以,我只需要一段代码来暂停特定时间间隔的过程.到目前为止,我使用此代码执行此操作:

System.Threading.Thread.Sleep(Interval);
Run Code Online (Sandbox Code Playgroud)

但是这段代码对我没有好处,因为它会停止整个过程并冻结程序.我不希望程序卡在DoAfterDelay方法中.这就是为什么Thread.Sleep没用.

所以有人可以提出更好的方法吗?当然我已经搜索过了,但我发现的大部分解决方案都是基于使用计时器(比如这里).但是使用计时器是我最后的意见,因为该方法应该运行一次并且使用计时器会使程序混淆读取.所以,如果有的话,我正在寻找更好的解决方案.或者我可能必须使用计时器?

我想我必须玩线程,但不确定.所以我想知道是否有人可以指导我找到解决方案.提前致谢.

Bar*_*icz 14

你能用任务吗?

    Task.Factory.StartNew(() =>
    {
        System.Threading.Thread.Sleep(Interval);
        TheMethod();
    });
Run Code Online (Sandbox Code Playgroud)

  • @MostafaFarzán让一个线程在那里做任何事情都是非常低效/浪费的,这样你就可以在一段时间后执行一些代码. (4认同)

Jim*_*non 13

您可以在此处使用.Net 4.5的异步等待功能

您可以使用Task.Delay以毫秒为单位给出延迟.这是一种非常干净的方式.例如:

    private async void button1_Click(object sender, EventArgs e)
    {
        await Task.Delay(5000);

        TheMethod();
    }
Run Code Online (Sandbox Code Playgroud)