Padrão Timeout - Quão ruim é Thread.Abort realmente?

Eu li em vários sites que o Thread.Abort não é muito bom de usar. Nesse caso, como você implementa um padrão de tempo limite? Por exemplo, eu li que o MS usa o padrão abaixo (que envolvi em um método de extensão) em toda a estrutura. Pessoalmente, acho que essa é uma extensão bem legal, mas estou preocupada com o Thread.Abort. Alguém tem uma maneira melhor?

 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;
        }
    }

questionAnswers(3)

yourAnswerToTheQuestion