Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 拖延的最简单方法_C#_.net - Fatal编程技术网

C# 拖延的最简单方法

C# 拖延的最简单方法,c#,.net,C#,.net,在函数内部延迟而不必延迟主线程的最简单/最简单的方法是什么? 这是我正在尝试做的,与此类似: private void FallingToggle(bool a) { a = true; Thread.Sleep(1000); a = false; } 但我发现它冻结了整个程序。 有办法解决这个问题吗?还是有更简单的方法来解决这个问题?这是一种方法 在函数调用事件中,a=true之后;开始一个新的线程。放 Thread.S

在函数内部延迟而不必延迟主线程的最简单/最简单的方法是什么? 这是我正在尝试做的,与此类似:

    private void FallingToggle(bool a)
    {
        a = true;
        Thread.Sleep(1000);
        a = false;
    }
但我发现它冻结了整个程序。 有办法解决这个问题吗?还是有更简单的方法来解决这个问题?

这是一种方法

在函数调用事件中,a=true之后;开始一个新的线程。放

Thread.Sleep(1000);
    a = false;  
在新的线程中

我认为这是最简单的方法。

这是方法

在函数调用事件中,a=true之后;开始一个新的线程。放

Thread.Sleep(1000);
    a = false;  
在新的线程中


我认为这是最简单的方法。

回应您的评论,有很多方法可以实现您正在尝试的目标

一种方法是记录动作第一次发生的时间,这可以通过使用来实现。然后,如果在记录时间的1秒内发生任何后续操作,请立即返回。例如:

DateTime lastActionTime = DateTime.Now;

// ...

if ((DateTime.Now - lastActionTime).Milliseconds < 1000)
{
    // Too soon to execute the action again
    return;
}

// Do whatever the action does...
// In a constructor or something
timer = new System.Windows.Forms.Timer();
timer.Interval = 1000; // 1000 milliseconds
timer.Tick += (s, e) => 
{
    button.Enabled = true;
    timer.Stop();
};

// ...

void OnButtonClick()
{
    button.Enable = false;
    timer.Start();

    // Do whatever the button does...
}

后者是您在GUI中使用的,前者可以用于类似游戏的东西。

回应您的评论,有许多方法可以实现您正在尝试的操作

一种方法是记录动作第一次发生的时间,这可以通过使用来实现。然后,如果在记录时间的1秒内发生任何后续操作,请立即返回。例如:

DateTime lastActionTime = DateTime.Now;

// ...

if ((DateTime.Now - lastActionTime).Milliseconds < 1000)
{
    // Too soon to execute the action again
    return;
}

// Do whatever the action does...
// In a constructor or something
timer = new System.Windows.Forms.Timer();
timer.Interval = 1000; // 1000 milliseconds
timer.Tick += (s, e) => 
{
    button.Enabled = true;
    timer.Stop();
};

// ...

void OnButtonClick()
{
    button.Enable = false;
    timer.Start();

    // Do whatever the button does...
}

后者是您在GUI中使用的,前者可以用于类似游戏的东西。

此代码表明您的项目存在严重的设计缺陷,您应该重新考虑是否需要任意睡眠1000分钟。你想做什么?这确实是最简单的延迟方法,也是同步延迟的唯一通用方法。但是,如图所示,这确实阻止了当前线程。否则,请考虑移动到异步模式,例如计时器和回调。您能解释一下为什么要这样延迟吗?这有点可疑。我之所以使用这种函数,是因为我想限制用户运行函数的频率,例如,消除用户在消息传递程序中滥发发送按钮。您需要创建一个计时器,并在勾选事件时禁用发送代码/按钮。此代码表明您的项目存在严重的设计缺陷,你应该重新考虑是否需要任意睡1000个小时。你想做什么?这确实是最简单的延迟方法,也是同步延迟的唯一通用方法。但是,如图所示,这确实阻止了当前线程。否则,请考虑移动到异步模式,例如计时器和回调。您能解释一下为什么要这样延迟吗?我之所以使用这种函数,是因为我想限制用户运行函数的频率,例如,消除用户在消息传递程序中滥发发送按钮。您需要创建一个计时器,并在勾选事件时禁用不发送的代码/按钮。不应使用thread.sleep。“mgbowen”在回答中提供的计时器选项和禁用按钮选项是一个更好的设计。不应该使用thread.sleep。“mgbowen”在回答中提供的定时器选项和禁用按钮选项是一个更好的设计。