超时模式 – Thread.Abort真的有多糟糕?
我在各种网站上看到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; } }
可能非常糟糕。
中止的线程可能会使共享状态损坏,可能会使异步操作运行,…
请参阅Joe Duffy的博客: “托管代码和异步exception加固” 。
基本上你在谈论中止一项行动(据我们所知)没有优雅的流产方式。
这意味着没有安全的方法可以中止它。 Thread.Abort
不是一件好事 – 有各种各样的竞争条件和你可以进入的丑陋情况(参见理查德答案中的链接)。 我会非常努力地避免想要取消不知道取消的操作 – 如果你必须这样做,请考虑重新启动整个应用程序,因为你可能不再处于理智状态。
这很糟糕,因为线程可能处于不一致状态或处于某些工作中,并且没有机会清除自己。
要正确关闭它,通过调用方法或设置属性来指示它停止正在执行的操作,然后在关闭应用程序或转移到其他任务之前执行Thread.Join以等待它关闭。
- 为什么VB中的lambda表达式与C#不同?
- 没有为“Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory”类型提供服务
- VS2015 C#interactive:错误CS7069:引用类型’Object’声称它是在’System.Runtime’中定义的,但是找不到它
- XNA C中的颜色替换#
- 使用Lambda或LINQ将类列表转换或映射到另一个类列表?
- 避免在重建期间删除当前的Lucene.NET索引
- 使用Azure的MSBuild – PublishProfileSet计算结果为“”
- C#readonly vs Get
- 我们如何跟踪azure文件存储文件夹是否更新?