定时器委托调用说“内存无法读取”

时间:2013-04-25 04:01:20

标签: c# multithreading timer

所以这就是我有一个函数和一个间隔为10毫秒的计时器。

void process()
{
    //some heavy processing logic here
}

现在我正在做的是我已将此功能添加到timer.tick delegeate

timer1.tick += process;

当我运行我的程序时,我的异常就是

  

多个线程开始执行相同的块和'某个地址的指令引用另一个地址。无法读取内存'

但是当我将间隔时间增加到500毫秒时,会在一段时间后抛出此异常。 我是c#的新手,有没有其他有效的方法可以做到这一点而不会遇到这样的错误。

3 个答案:

答案 0 :(得分:0)

你开始处理每个计时器滴答,所以一段时间后你的电脑真的会慢下来。这是因为你不控制线程数。而且我假设它们使用相同的资源,因为你没有传递任何参数。这些资源可能不是线程安全的,这会导致异常

答案 1 :(得分:0)

间隔完成后,定时器会触发触发器。你的函数被多次破坏上下文使用。更改计时器间隔,只要您的Process方法的最大运行时间更改为此(在启动功能中禁用计时器并在此之后启用):

void process()
{
timer1.Enabled=false;
//some heavy processing
timer1.Enabled=true;
}

否则你必须使用信号量。

答案 2 :(得分:0)

现在我意识到在这个函数中我有一些变量正被程序用来正确运行,所以当这个函数被同一个不同的线程多次访问时,它就会出错。 所以我通过使用锁

来防止这种情况
void process()
{
   lock(frameExtractor) // frame extractor is the variable where frames are stored
   //  then do some heavy processing 
}