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

本文关键字:读取 内存 调用 计时器 | 更新日期: 2023-09-27 18:10:51

事情是这样的,我有一个函数和一个定时器,间隔为10ms。

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

现在我要做的是,我已经把这个功能添加到计时器。蜱虫delegeate

timer1.tick += process;

当我运行我的程序时,我得到一个异常,说

多个线程开始执行同一个块,并且在某个地址的指令引用到另一个地址。无法读取内存

但是当我将间隔时间增加到500ms时,这个异常会在一段时间后抛出。我对c#有点陌生,有没有其他有效的方法来做到这一点,而不会面临这样的错误

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

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

计时器在间隔结束后滴答触发。你的函数被多个正在运行的上下文使用。将定时器间隔更改为进程方法的最大运行时间,并更改为以下内容(在启动功能中禁用定时器,然后启用):

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

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

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