为了账号安全,请及时绑定邮箱和手机立即绑定

关于在.NET中干净地终止线程的问题

关于在.NET中干净地终止线程的问题

墨色风雨 2019-07-26 15:43:17
关于在.NET中干净地终止线程的问题我理解Thread.Abort()在我读过的关于这个主题的大量文章中是邪恶的,所以我目前正在扯掉我的中止,以便以更清洁的方式取代它; 并且在比较了stackoverflow上的人们的用户策略之后,然后在阅读MSDN上的“ 如何:创建和终止线程(C#编程指南) ”之后,两者都说明了一种非常相似的方法 - 即使用volatile bool方法检查策略,这很好,但我还有几个问题....如果你没有一个简单的工作进程只是运行一个运算循环的代码,那么我的优势就在于此。比如说对我来说,我的进程是一个后台文件上传程序进程,我实际上是循环遍历每个文件,所以这是一些东西,并确保我可以while (!_shouldStop)在顶部添加我的每个循环迭代,但我有更多的业务流程它发生在它下一次循环迭代之前发生,我希望这个取消程序是快节奏的; 不要告诉我,我需要在整个工作人员功能中每隔4-5行循环播放这些?我真的希望有一个更好的方法,有人可以告诉我这是否实际上是正确的[并且只有?]做到这一点的方法,或者他们过去用来实现我所追求的目标的策略。谢谢帮派。进一步阅读:所有这些SO响应都假设工作线程将循环。这并不适合我。如果它是线性的,但是及时的背景操作怎么办?
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

好吧,不幸的是,在多线程中,你经常不得不妥协“快速”以获得清洁......你可以立即退出一个线程Interrupt,但它不会很干净。所以不,你不必_shouldStop每隔4-5行清理一次支票,但是如果你确实打断了你的线程,那么你应该处理异常并以干净的方式退出循环。

更新

即使它不是一个循环线程(也许它是一个线程执行一些长时间运行的异步操作或某种类型的块用于输入操作),你可以Interrupt,但你仍然应该抓住ThreadInterruptedException并彻底退出线程。我认为你读过的例子非常合适。

更新2.0

是的我有一个例子......我只会根据您引用的链接向您展示一个示例:

public class InterruptExample{
    private Thread t;
    private volatile boolean alive;

    public InterruptExample()
    {
        alive = false;

        t = new Thread(()=>
        {
            try
            {
                while (alive)
                {
                    /* Do work. */
                }
            }
            catch (ThreadInterruptedException exception)
            {
                /* Clean up. */
            }
        });
        t.IsBackground = true;
    }

    public void Start()
    {
        alive = true;
        t.Start();
    }


    public void Kill(int timeout = 0)
    {
        // somebody tells you to stop the thread
        t.Interrupt();

        // Optionally you can block the caller
        // by making them wait until the thread exits.
        // If they leave the default timeout, 
        // then they will not wait at all
        t.Join(timeout);
    }}


查看完整回答
反对 回复 2019-07-26
  • 3 回答
  • 0 关注
  • 805 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信