在backgroundworker函数中未处理StackOverflowException

本文关键字:未处理 StackOverflowException 函数 backgroundworker | 更新日期: 2023-09-27 18:20:52

我想成为连续工作的后台工作者。但我收到错误"StackOverflowException未处理"如何修复?或者有不同的方法吗?我很抱歉我的英语不好。。

private void Form1_Load(object sender, EventArgs e)
    {
       workerMesaj.RunWorkerAsync();
    }

private void workerMesaj_DoWork(object sender, DoWorkEventArgs e)
     {
        /*
           ... some codes
        */
        System.Threading.Thread.Sleep(100);
        workerMesaj_DoWork(sender,e)          //i'm trying create loop forever with this code. 
     }

在backgroundworker函数中未处理StackOverflowException

//i'm trying create loop forever with this code.

您正在创建未绑定递归,它在每个workerMesaj_DoWork上创建堆栈帧。最终,你的堆栈耗尽了,你就有了这个例外。如果你想要永久循环,你应该使用循环,而不是递归。

不要从内部启动工作线程,否则它永远无法正确处理,因为父线程正在托管另一个子线程,并且在处理子线程之前无法进行处理。这种情况一直持续下去,从而导致溢出。

相反,通过创建这样的while循环,在工作线程内部创建循环;

private void workerMesaj_DoWork(object sender, DoWorkEventArgs e)
     {
        bool RunWorker=true;
        while(RunWorker)
        {
        /*
           ... some codes
        */
        }
     }

此外,研究一下你计划做什么,因为它们很可能是一个事件触发的解决方案,如果是这样的话,那么这是一种更干净的方式来创建一个倾听者或持续工作者。