Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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定时器,在标签中显示执行时间,而不删除任何定时器。间隔事件?_C# - Fatal编程技术网

C# 如何制作一个实时C定时器,在标签中显示执行时间,而不删除任何定时器。间隔事件?

C# 如何制作一个实时C定时器,在标签中显示执行时间,而不删除任何定时器。间隔事件?,c#,C#,我有一个启动计时器的按钮,计时器会每100ms打印一次当前的执行时间,但是当我做一些计算时,计时器会暂停,直到计算完成,我想计算会打扰计时器,因此计时器会被删除或阻塞这个线程 事实上,计算非常复杂,可能需要40秒,我只需要每100毫秒显示一次执行时间,告诉用户这个函数离结束有多近,你能告诉我怎么做吗 double a = 0; public Form1() { InitializeComponent(); timer1.Interval =

我有一个启动计时器的按钮,计时器会每100ms打印一次当前的执行时间,但是当我做一些计算时,计时器会暂停,直到计算完成,我想计算会打扰计时器,因此计时器会被删除或阻塞这个线程

事实上,计算非常复杂,可能需要40秒,我只需要每100毫秒显示一次执行时间,告诉用户这个函数离结束有多近,你能告诉我怎么做吗

    double a = 0;
    public Form1()
    {
        InitializeComponent();
        timer1.Interval = 100;
    }

    private void timer1_Tick(object sender, EventArgs e)
    {

        a += 0.1;
        label1.Text = a.ToString();
    }

    private void UserStartTimer_Click(object sender, EventArgs e)
    {
        a = 0.0;
        timer1.Enabled = true;

    }

    private void UserCalcSomething_Click(object sender, EventArgs e)
    {
        double s = 0;
        for (int i = 0; i < 100000; i++)
        {
            for (int j = 0; j < 10000; j++)
            {
                s = i + j;
            }
        }
    }

    private void UserStopTimer_Click(object sender, EventArgs e)
    {
        timer1.Enabled = false;
    }

只需在另一个线程或任务中执行计算:

private void UserCalcSomething_Click(object sender, EventArgs e)
{
    Task.Factory.StartNew(() => {
       double s = 0;
       for (int i = 0; i < 100000; i++)
       {
           for (int j = 0; j < 10000; j++)
           {
               s = i + j;
           }
       }
    }
}

可能的Thx副本供您回复。但事实上,在我的例子中,长时间运行的操作包含很多thread.sleeprandom和update label/button/chart,而不仅仅是循环中的循环,因此即使我添加了Application.DoEvent,thread.sleeprandom的优先级仍然高于Timer对象在非实时操作系统上没有实时性。计时器不准确,间隔设置为100的含义很好,在100毫秒或更长时间后,将发出滴答声事件的信号