使用线程时出现奇怪的问题
本文关键字:问题 线程 | 更新日期: 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
}
}
请帮。
编辑:现在您已经更改了代码,有两个问题:
-
如果在处理完成后调用
processQueue
,则可能尝试重新启动线程。你不能这么做。 -
如果
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匹配线程参数的签名,但它不正确,所以线程永远不会得到一个有效的函数,所以它永远不会启动。线程运行的函数应该是静态函数,在本例中,我将把线程移到处理类对象中。