Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 超时模式-线程有多糟糕。真的要中止吗?_C#_Multithreading_Extension Methods - Fatal编程技术网

C# 超时模式-线程有多糟糕。真的要中止吗?

C# 超时模式-线程有多糟糕。真的要中止吗?,c#,multithreading,extension-methods,C#,Multithreading,Extension Methods,我在各种网站上读到过这样的文章:Thread.Abort不太好用。在这种情况下,如何实现超时模式?例如,我读到MS在整个框架中使用下面的模式(我用扩展方法包装了它)。就个人而言,我认为这是一个非常酷的扩展,但我担心Thread.Abort。有人有更好的方法吗 public static bool CallandWait(this Action action, int timeout) { Thread subThread = null; Action w

我在各种网站上读到过这样的文章: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;
        }
    }

这是不好的,因为线程可能处于不一致的状态或者在某些工作的中间,并且没有机会清除自己。


要正确地关闭它,您可以通过调用一个方法或设置一个属性来发出信号,让它停止正在执行的操作,然后执行Thread.Join直到它关闭,然后再关闭您的应用程序或转到其他任务。

基本上,您所说的是中止一个(据我们所知)无法中止的操作

这意味着没有安全的方法可以中止它
Thread.Abort
不是一件好事情,你可能会遇到各种各样的竞争条件和丑陋的情况(参见中的链接)。我会竭尽全力地避免取消那些不知道取消的行为——如果你真的必须这么做,考虑重新启动整个应用程序,因为你可能不再处于正常状态。

可能非常糟糕。

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

请参阅Joe Duffy的博客: