加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

关于C#代表的一个问题

发布时间:2020-12-15 08:17:48 所属栏目:百科 来源:网络整理
导读: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 Se
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()

打印“msg”
还有这个

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();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读