我正在使用线程来启动类的公共函数。问题是只有在线程函数(类的公共函数)内设置断点时才会被调用,否则调用Thread.Start没有任何效果。一旦调用了线程函数,它就会成功完成所需的结果。
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
}
}
请帮忙。
答案 0 :(得分:4)
编辑:既然您已经更改了代码,那么有两个问题:
如果您在处理完成后调用processQueue
,则可能会尝试重新启动一个线程。你做不到。
如果从多个线程调用processQueue
,则由于竞争条件以及内存模型潜在问题而存在可能启动多个线程的问题。
第一点更简单地用以下方法解决:
if (subprocess == null || !subprocess.IsAlive)
{
subprocess = new Thread(processor.run);
subprocess.IsBackground = true;
subprocess.Start();
}
......但这仍然存在第二点的潜在问题。什么叫processQueue
?它始终是相同的线程吗? (你为什么忽略.NET命名约定?)
我的猜测是你所看到的实际处理发生了一次,但没有工作要做,未来的调用没有重新启动线程,大概是你预期的 - 而如果你在那里有断点,那么当你再次点击“去”时,还有工作要做。猜测...当然启动一个线程 没有断点工作,所以缺陷就在你的代码中。如果您可以生成一个简短但完整的程序来演示问题,我们可以深入了解它。
你的线程几乎什么也没做,所以线程在到达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
始终为false。
目前尚不清楚为什么您首先拥有此代码 - 您想要实现的目标是什么?
答案 1 :(得分:0)
所以问题是processor.run匹配线程参数的签名但它不正确,所以线程永远不会获得有效的函数,因此它永远不会启动。线程运行的函数应该是一个静态函数,在这种情况下,我会将线程移动到处理类对象。