当前位置:  开发笔记 > 编程语言 > 正文

超时模式 - Thread.Abort真的有多糟糕?

如何解决《超时模式-Thread.Abort真的有多糟糕?》经验,为你挑选了2个好方法。

我在各种网站上看到Thread.Abort不是很好用.在这种情况下,如何实现超时模式?例如,我已经读过MS在整个框架中使用下面的模式(我已经用扩展方法包装).就个人而言,我认为这是一个非常酷的扩展,但我担心Thread.Abort.有没有人有更好的方法?

 public static bool CallandWait(this Action action, int timeout)
    {
        Thread subThread = null;
        Action wrappedAction = () =>
        {
            subThread = Thread.CurrentThread;
            action();
        };

        IAsyncResult result = wrappedAction.BeginInvoke(null, null);

        if (((timeout != -1) && !result.IsCompleted) && (!result.AsyncWaitHandle.WaitOne(timeout, false) || !result.IsCompleted))
        {
            if (subThread != null)
            {
                subThread.Abort();
            }

            return false;
        }
        else
        {
            wrappedAction.EndInvoke(result);
            return true;
        }
    }

Jon Skeet.. 13

基本上你在谈论中止一项行动(据我们所知)没有优雅的流产方式.

这意味着没有安全的方法可以中止它.Thread.Abort这不是一件好事 - 有各种各样的竞争条件和你可以进入的丑陋情况(参见理查德答案中的链接).我会非常努力地避免想要取消不知道取消的操作 - 如果你必须这样做,请考虑重新启动整个应用程序,因为你可能不再处于理智状态.



1> Jon Skeet..:

基本上你在谈论中止一项行动(据我们所知)没有优雅的流产方式.

这意味着没有安全的方法可以中止它.Thread.Abort这不是一件好事 - 有各种各样的竞争条件和你可以进入的丑陋情况(参见理查德答案中的链接).我会非常努力地避免想要取消不知道取消的操作 - 如果你必须这样做,请考虑重新启动整个应用程序,因为你可能不再处于理智状态.



2> Richard..:

可能非常糟糕.

中止的线程可能会使共享状态损坏,可能会使异步操作运行,...

请参阅Joe Duffy的博客:"托管代码和异步异常加固".

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有