使用线程时出现奇怪的问题

本文关键字:问题 线程 | 更新日期: 2023-09-27 18:13:27

我使用线程来启动一个类的公共函数。问题是,只有在线程函数(类的公共函数)内部设置断点,它才会被调用,否则调用线程。开始没有任何效果。一旦线程函数被调用,它就成功地完成了,并给出了期望的结果。

 QueueProcessor     processor  = null;
 Thread subprocess =null;
 public void processQueue()
 {
    if (processor == null)
    {         
        processor = new QueueProcessor();
    }
    if (subprocess == null)
    {                                            
        subprocess = new Thread(processor.run);
        subprocess.IsBackground = true;
    }
    if (!subprocess.IsAlive)
    {                
        subprocess.Start();                                
    }
    else
    {          
    }
} 
class QueueProcessor
{       
    public QueueProcessor()
    {           
        instance = new RecordDao();
        service = new CommonsService();
    }
    public void run()
    {
        startProcessing(); // it won't reach here unless a breakpoint is set.
    }
    public bool startProcessing()
    {
        //some database routines here.
       // some web service calls here
    }
}

请帮。

使用线程时出现奇怪的问题

编辑:现在您已经更改了代码,有两个问题:

  1. 如果在处理完成后调用processQueue,则可能尝试重新启动线程。你不能这么做。

  2. 如果processQueue是从多个线程中调用的,那么由于竞争条件,您可能会遇到启动多个线程的问题,并且还有内存模型潜在的问题。

第一点更简单的解决方法是:
if (subprocess == null || !subprocess.IsAlive)
{                                            
    subprocess = new Thread(processor.run);
    subprocess.IsBackground = true;
    subprocess.Start();
}

…但这仍然留下了第二点的潜在问题。什么叫processQueue ?它总是同一条线吗?(为什么要忽略。net的命名约定?)

我的猜测是,你所看到的是实际上处理恰好发生一次,但是没有工作要做,并且未来的调用不会像你预期的那样重新启动线程-然而,如果你在那里有断点,那么当你再次点击"go"时,有工作要做。我猜……当然,启动一个线程在没有断点的情况下也可以工作,所以缺陷是在代码中的某个地方。如果你能写出一个简短但完整的程序来演示这个问题,我们就能弄清问题的根源了。


你的线程几乎什么都不做,所以线程在到达while循环之前完成是完全合理的。不是它不开始,而是它开始了,然后马上结束。

或者,您可以有这样的执行流:

Main thread                  New thread status
                             Not started...
Check: IsAlive == false
                             Still not started...
Check: IsAlive == false
                             Starting!
                             Call startProcessing...
                             startProcessing completes...
                             Finished
Check: IsAlive == false

线程已经执行,没有问题,但是IsAlive总是假的。

不清楚为什么你首先有这个代码-你想要达到什么目的?

所以问题是processor.run匹配线程参数的签名,但它不正确,所以线程永远不会得到一个有效的函数,所以它永远不会启动。线程运行的函数应该是静态函数,在本例中,我将把线程移到处理类对象中。