首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >中止的线程不能再次启动

中止的线程不能再次启动
EN

Stack Overflow用户
提问于 2015-03-18 18:13:30
回答 5查看 93关注 0票数 0

我有一个问题,不知道如何解决。我正在开始一个新的线程:

代码语言:javascript
运行
复制
private void button_Click(object sender, EventArgs e)
{
        Thread thrd = new Thread(new ThreadStart(loadingScreenStart));
        thrd.Start();

        //setting some variables, entering some methods etc...

        thrd.Abort();
}

public void loadingScreenStart()
{
        splashScreen splashObj = splashScreen.GetInstance();
        Application.Run(splashScreen.GetInstance());
}

在另一种形式中,我有:

代码语言:javascript
运行
复制
private static splashScreen m_instance = null;
private static object m_instanceLock = new object();

public static splashScreen GetInstance()
{
        lock (m_instanceLock)
        {
            if (m_instance == null)
            {
                m_instance = new splashScreen();
            }
        }
        return m_instance;
}

这很好用,但是当我第二次点击按钮时,我得到一个异常,那就是无法访问被丢弃的对象。为什么以及如何解决这个问题?我的意思是,在线程中止后,我会在再次点击按钮时创建一个新的线程。

EN

Stack Overflow用户

发布于 2015-03-18 18:23:19

代码语言:javascript
运行
复制
Thread thrd = new Thread(new ThreadStart(loadingScreenStart));
thrd.Start();

//setting some variables, entering some methods etc...

thrd.Abort();

为什么要调用thrd.Abort()?你知道线程结束了吗?您必须等待线程完成。并在这里使用双重检查

代码语言:javascript
运行
复制
public static splashScreen GetInstance()
{
        if (m_instance == null)
        {
            lock (m_instanceLock)
            {
                if (m_instance == null)
                {
                   m_instance = new splashScreen();
                }
            }
        }
        return m_instance;
}

也许当你调用Run splashscreen时,它已经被释放了。尝试创建它并将其捕获到一个字段,然后将其传递给您的方法。尝尝这个。

代码语言:javascript
运行
复制
Task.Run(() => 
        var splashObj = splashScreen.GetInstance();
        Application.Run(splashObj);
    }));
票数 0
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29119248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档