Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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_Events_Timer - Fatal编程技术网

C# 检查线程中的计时器是否已过期

C# 检查线程中的计时器是否已过期,c#,.net,events,timer,C#,.net,Events,Timer,我在.NET backgroundworker中运行了一个while循环。我想在Timers.Timer达到0时结束循环 问题是,因为我在另一个线程(backgroundworker)中工作,所以我的计时器必须在同一个线程中实例化。所以我不能设置任何私有布尔计时器。我还不知道如何给出布尔thro事件的引用 代码示例: private bool timer_Elapsed = false; private void backgroundWorker_DoWork(object sende

我在.NET backgroundworker中运行了一个while循环。我想在Timers.Timer达到0时结束循环

问题是,因为我在另一个线程(backgroundworker)中工作,所以我的计时器必须在同一个线程中实例化。所以我不能设置任何私有布尔计时器。我还不知道如何给出布尔thro事件的引用

代码示例:

private bool timer_Elapsed = false;

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        System.Timers.Timer timer = new System.Timers.Timer();
        Set_Timer(timer);

        timer.Start();

        while(timer_Elapsed) //Has to be a boolean that indicates if timer elapsed
        {
            this.Do_Proces();
        }
    }

    private void Set_Timer(System.Timers.Timer timer)
    {
        timer.Interval = 200;
        timer.Elapsed += new ElapsedEventHandler(timer_ElapsedEvent);
    }

    private void timer_ElapsedEvent(object source, ElapsedEventArgs e)
    {
        timer_Elapsed = true; //I can't set my private boolean since it got instantiated in another thread
    }
代码中的特殊问题。我对这种东西不熟悉。 有什么建议吗?提前谢谢


编辑:为了澄清,我希望Do_Proces()运行200毫秒,当时间过去时,我希望它停止。当它在200毫秒后停止时,我想使用backgroundWorker中生成的数据更新GUI。然后检查用户是否希望进程停止,如果不希望,我希望它再次运行。。我使用计时器是因为线程需要重新启动很多次,这也会对主线程产生影响,严重影响用户体验。

计时器除了这里列出的以外还有其他用途吗?如果没有,您可能只想在BackgroundWorker方法的开头记录当前时间,并更改while循环的条件以检查所需的时间是否已过

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    TimeSpan timeout = TimeSpan.FromMinutes(5);
    DateTime start_time = DateTime.Now;

    while(DateTime.Now - start_time < timeout)
    {
        this.Do_Proces();
    }
}
private void backgroundWorker\u DoWork(对象发送方,DoWorkEventArgs e)
{
TimeSpan timeout=TimeSpan.FromMinutes(5);
DateTime start\u time=DateTime.Now;
while(DateTime.Now-开始时间<超时)
{
这是你的程序;
}
}

计时器是否有此处所列以外的其他用途?如果没有,您可能只想在BackgroundWorker方法的开头记录当前时间,并更改while循环的条件以检查所需的时间是否已过

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    TimeSpan timeout = TimeSpan.FromMinutes(5);
    DateTime start_time = DateTime.Now;

    while(DateTime.Now - start_time < timeout)
    {
        this.Do_Proces();
    }
}
private void backgroundWorker\u DoWork(对象发送方,DoWorkEventArgs e)
{
TimeSpan timeout=TimeSpan.FromMinutes(5);
DateTime start\u time=DateTime.Now;
while(DateTime.Now-开始时间<超时)
{
这是你的程序;
}
}


您是否已验证确实无法跨线程读取/写入私有布尔值?我想你可以。尝试一下您当前的代码,并更新您的问题,以验证您是否确实捕获了异常。否则就没有真正的问题需要解决:)有趣的一面:如果你的循环看起来好像没有运行;这是因为您的“while”子句可能应该是“while(!timer_appeased)”代码令人困惑:是否希望
this.Do_Proces
在特定的时间量(间隔)后调用?由于
timer\u expased
初始化为false,while循环将立即中断,并且
不会调用this.Do\u Proces
。如果你使用
Thread.Sleep(130);这是你的程序而不是一个计时器所有?我的意见,不便之处深表歉意。在编辑中澄清整个过程。您当然可以从另一个线程设置私有字段,但是您可能需要将
timer\u expead
声明为
volatile
,但是@ceykooo的答案要好得多,如果您只需要循环直到某个时间间隔过期。您是否验证过您确实无法跨线程读/写私有布尔值?我想你可以。尝试一下您当前的代码,并更新您的问题,以验证您是否确实捕获了异常。否则就没有真正的问题需要解决:)有趣的一面:如果你的循环看起来好像没有运行;这是因为您的“while”子句可能应该是“while(!timer_appeased)”代码令人困惑:是否希望
this.Do_Proces
在特定的时间量(间隔)后调用?由于
timer\u expased
初始化为false,while循环将立即中断,并且
不会调用this.Do\u Proces
。如果你使用
Thread.Sleep(130);这是你的程序而不是一个计时器所有?我的意见,不便之处深表歉意。在编辑中澄清整个过程。您当然可以从另一个线程设置私有字段,但是您可能需要将
timer\u expead
声明为
volatile
,但是@ceykooo的答案要好得多,如果你所需要做的就是循环直到某个时间间隔结束。计时器确实没有任何其他用途。时间跨度到底是做什么的?我在互联网上快速搜索了一下,但并不真正理解这个概念。谢谢你的评论@user1933169
TimeSpan
只是一个存储两个
DateTime
s之间差异的类。基本上,时间跨度为“5分钟”,而日期时间为“2013年1月1日下午8:13”。您可以使用
TimeSpan.fromMillimes(130)
来匹配原始代码中的时间间隔。好的,知道了。我知道日期时间的概念。非常感谢你!只是需要注意的一件小事
DateTime。现在
在时间(双关语不是故意的)和cpu使用方面相对昂贵。我相信在这种情况下这不应该是一个问题,但是在获取
DateTime.Now
时一定要小心,在任何性能关键的事情上都要快速连续地重复@我不知道这件事,谢谢。我想我以前从未在生产中使用过这种模式,但我一定会记住它。在while循环中有一个足够长的方法调用,或者可能有一个
线程。Sleep
,应该足以缓解它。计时器确实没有任何其他用途。时间跨度到底是做什么的?我在互联网上快速搜索了一下,但并不真正理解这个概念。谢谢你的评论@user1933169
TimeSpan
只是一个存储两个
DateTime
s之间差异的类。基本上,时间跨度为“5分钟”,而日期时间为“2013年1月1日下午8:13”。您可以使用
TimeSpan.fromMillimes(130)
来匹配原始代码中的时间间隔。好的,知道了。我知道日期时间的概念。非常感谢你!只是需要注意的一件小事<代码