C# 在windows窗体应用程序C中使用计时器运行特定时间的循环#

C# 在windows窗体应用程序C中使用计时器运行特定时间的循环#,c#,timer,C#,Timer,我试图在特定的时间内重复进行一些计算(时间是可变的,由用户提供) 我尝试使用VisualStudio中windows窗体应用程序工具箱中可用的计时器,但似乎出现了问题。当我启动计时器并将time变量与while循环关联时,程序卡住;time变量在计时器的每个滴答事件中都被递减,只要时间大于0,我就需要运行while循环 private void timer1_Tick(object sender, EventArgs e) { if (time == 0)

我试图在特定的时间内重复进行一些计算(时间是可变的,由用户提供)

我尝试使用VisualStudio中windows窗体应用程序工具箱中可用的计时器,但似乎出现了问题。当我启动计时器并将
time
变量与while循环关联时,程序卡住;
time
变量在计时器的每个滴答事件中都被递减,只要时间大于0,我就需要运行while循环

private void timer1_Tick(object sender, EventArgs e)
    {
        if (time == 0)
            timer1.Stop();

        else
        {
            time--;
            textBoxTime.Text = time.ToString();
        }

    }
这是阻止程序的while循环

while (time>0)
{
   computations();
}

您可以使用Timer类进行此操作。一个简单的示例如下:

Clock=new Timer();
Clock.Interval=time;
Clock.Start();
Clock.Tick+=new EventHandler(OnTimer_Tick);
其中OnTimer_Tick是一个执行某些工作的函数

public void OnTimer_Tick(object sender,EventArgs eArgs)
{
//do computations here
}
这里有一个相关的例子


编辑:你的while循环比tick运行得快,所以你运行了很多循环。我更新了timer,以使用时间变量作为其间隔值,并去掉while循环,对每个刻度进行计算。

您可以使用timer类进行此操作。一个简单的示例如下:

Clock=new Timer();
Clock.Interval=time;
Clock.Start();
Clock.Tick+=new EventHandler(OnTimer_Tick);
其中OnTimer_Tick是一个执行某些工作的函数

public void OnTimer_Tick(object sender,EventArgs eArgs)
{
//do computations here
}
这里有一个相关的例子

编辑:你的while循环比tick运行得快,所以你运行了很多循环。我更新了计时器,将时间变量用作它的间隔值,去掉while循环,并对每个刻度进行计算

我试图在特定的时间内重复进行一些计算,时间是可变的,由用户提供

我建议您在循环开始时记下循环本身,检查每个循环迭代的当前时间,并查看它是否已经运行了足够长的时间,而不是使用计时器来倒计时

这是阻止程序的while循环

while (time>0)
{
   computations();
}
假设您正在UI线程上执行计算。这将阻止处理任何UI消息,包括计时器滴答声,从而使应用程序无响应

启动一个单独的线程以执行实际计算。是从WinForms执行此操作的常用方法,尽管有许多方法

我试图在特定的时间内重复进行一些计算,时间是可变的,由用户提供

我建议您在循环开始时记下循环本身,检查每个循环迭代的当前时间,并查看它是否已经运行了足够长的时间,而不是使用计时器来倒计时

这是阻止程序的while循环

while (time>0)
{
   computations();
}
假设您正在UI线程上执行计算。这将阻止处理任何UI消息,包括计时器滴答声,从而使应用程序无响应

启动一个单独的线程以执行实际计算。是从WinForms执行此操作的常用方法,尽管有许多方法。

您可以使用

此外,最好将睡眠置于循环中,以避免占用您所有的机器资源

 var sw = new Stopwatch();
 sw.Start();
 while(sw.Elapsed.TotalSeconds < 100 /*Time in second*/)
 {
    /// TODO
    Thread.Sleep(100 /*Time in millisecond*/);
 }
 sw.Stop();
var sw=新秒表();
sw.Start();
而(sw.appeased.TotalSeconds<100/*秒内的时间*/)
{
///待办事项
睡眠(100/*时间,毫秒*/);
}
sw.Stop();
您可以使用

此外,最好将睡眠置于循环中,以避免占用您所有的机器资源

 var sw = new Stopwatch();
 sw.Start();
 while(sw.Elapsed.TotalSeconds < 100 /*Time in second*/)
 {
    /// TODO
    Thread.Sleep(100 /*Time in millisecond*/);
 }
 sw.Stop();
var sw=新秒表();
sw.Start();
而(sw.appeased.TotalSeconds<100/*秒内的时间*/)
{
///待办事项
睡眠(100/*时间,毫秒*/);
}
sw.Stop();

问题似乎出在while循环上计时器工作正常我已经检查过了!while循环由于某些原因无法工作,并且程序被卡住。我相信您想根据您的时间变量检查计时器的滴答声值吗?这将导致它一直运行,直到计时器达到时间变量保持的值为止。对于while循环,因为没有退出条件,所以每次都会遇到一个无限循环。但是我会随着每个滴答声减少时间值,所以在执行计算时,计时器会减少时间值,直到它达到0,这就是退出条件。您是否在计算函数内减少时间值?或者,您是说在计时器对象的Tick事件上有一个减少全局时间变量值的事件处理程序吗?我在计时器对象的Tick事件上有一个减少全局时间变量值'private void timer1_Tick(object sender,EventArgs e){if(time==0)timer1.Stop();else{time--;textBoxTime.Text=time.ToString();}}}问题似乎出在while循环中计时器工作正常我已经检查过了!while循环由于某些原因无法工作,并且程序被卡住。我相信您想根据您的时间变量检查计时器的滴答声值吗?这将导致它一直运行,直到计时器达到时间变量保持的值为止。对于while循环,因为没有退出条件,所以每次都会遇到一个无限循环。但是我会随着每个滴答声减少时间值,所以在执行计算时,计时器会减少时间值,直到它达到0,这就是退出条件。您是否在计算函数内减少时间值?或者,您是说在计时器对象的Tick事件上有一个减少全局时间变量值的事件处理程序吗?我在计时器对象的Tick事件上有一个减少全局时间变量值'private void timer1_Tick(object sender,EventArgs e){if(time==0)timer1.Stop();else{time--;textBoxTime.Text=time.ToString();}}}我相信Eric是正确的。您的“while(time>0)”循环位于何处?如果它在UI线程上,那么Timer Tick事件处理程序将永远不会被调用。我相信Eric是正确的。哪里