class ClassA
{
public delegate void WriteLog(string msg);
private WriteLog m_WriteLogDelegate;
public ClassA(WriteLog writelog)
{
m_WriteLogDelegate = writelog;
Thread thread = new Thread(new ThreadStart(Search));
thread.Start();
}
public void Search()
{
/* ... */
m_WriteLogDelegate("msg");
/* ... */
}
}
class classB
{
private ClassA m_classA;
protected void WriteLogCallBack(string msg)
{
// prints msg
/* ... */
}
public classB()
{
m_classA = new ClassA(new WriteLog(WriteLogCallBack));
}
public void test1()
{
Thread thread = new Thread(new ThreadStart(Run));
thread.Start();
}
public void test2()
{
m_classA.Search();
}
public void Run()
{
while(true)
{
/* ... */
m_classA.Search();
/* ... */
Thread.Sleep(1000);
}
}
}
为什么是下面的代码
ClassB b = new ClassB();
b.test2()
打印“消息” 还有这个
ClassB b = new ClassB();
b.test1()
不打印任何东西?
最佳答案
您的程序可能退出导致线程终止(或在线程有时间启动之前)。 正如您显式创建线程一样,您需要显式等待线程完成!
您需要使用Thread.Join
或其他一些方法让主程序一直等待线程完成。
一个可能的选择,使用 Thread.Join
:
public Thread test2()
{
...
return thread;
}
...
b.test2().Join(); // wait for test2 to complete
另一个选项,使用 ManualResetEvent
:
class classB
{
private ManualResetEvent mre = new ManualResetEvent(false);
...
private void Run()
{
...
this.mre.Set(); // we completed our task
}
public void Wait();
{
this.mre.WaitOne();
}
然后你的代码调用b.test2()
:
b.test2();
b.Wait();
关于c# - 关于 C# 委托(delegate)的一个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6309706/