Pull to refresh

Comments 17

, but it will automatically be raised again at the end of the catch block. When this exception is raised, the runtime executes all the finally blocks before ending the thread

да, годится, правда, я сделал без ResetAbort (явного)
еще варианты?
 static void DoSmth()
 {
  Action crash = delegate() { Thread.CurrentThread.Abort(); };
  crash.EndInvoke( crash.BeginInvoke( null, null ) );
 }


* This source code was highlighted with Source Code Highlighter.
да, это мое решение )
хабраюзеры в очередной раз удивили меня своей скоростью ))
Фигня это все. Написал, не зная C# :). Этюды — это когда смотришь на код и понимаешь что ты НЕ ПОНИМАЕШЬ :). Как у Александреску.
наверное, так и есть
постараюсь придумать что-то посложнее…
Удачи :) Рекомендую Reflection и MSIL. Там наверняка есть неочевидные вещи.
  static void DoSmth()
  {
    try
    {
      Thread.CurrentThread.Abort();
    }
    catch (ThreadAbortException e)
    {
      Thread.ResetAbort();
      throw e;
    }
  }

* This source code was highlighted with Source Code Highlighter.
Ответ был очевиден ))
но, раз уж не успел запостить нормальный вариант, сделал альтернативный :)
Разумеется костыль, но… работает )
static void DoSmth()
{
  ConstructorInfo[] constructors = typeof(ThreadAbortException).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);
  foreach (var constructor in constructors)
  {
    if (constructor.GetParameters().Length == 0)
      throw (Exception)constructor.Invoke(new object[0]);
  }
}


* This source code was highlighted with Source Code Highlighter.
хех, интересно
правда, у сборки должны быть какие-то права, чтобы выполнять такой код, нет?
хм… вопрос для размышления…
надо будет почитать на ту тему… по-моему нет… но может я и ошибаюсь.
вообще у меня скомпилировалось и запустилось без проблем
что мне кажется довольно странным
неужели нужно явно указывать ограничения в AppDomain, чтоб такой код был невозможен? я почему-то считал, что он невозможен по умолчанию, и нужно явное разрешение или фулл-траст сборка
Не знаю можно ли делать так по условию, но вот:
  1. using System;
  2.     using System.Threading;
  3.     using System.Runtime.Serialization;
  4.  
  5.     class App
  6.     {
  7.  
  8.         static void DoSmth()
  9.         {
  10.             Exception o = (Exception)FormatterServices.GetSafeUninitializedObject(typeof (ThreadAbortException));
  11.             throw o;
  12.             // TODO : Add code here
  13.         }
  14.  
  15.         static void Main()
  16.         {
  17.             try
  18.             {
  19.                 Console.WriteLine("veni");
  20.                 DoSmth();
  21.             }
  22.             catch (ThreadAbortException)
  23.             {
  24.                 Console.WriteLine("vidi");
  25.             }
  26.             Console.WriteLine("vici");
  27.         }
  28.     }
* This source code was highlighted with Source Code Highlighter.
прекрасно, еще один метод в копилку )
условия задачи не нарушены
Продолжайте, пожалуйста, писать этюды, по-моему очень интересно, да и отличный повод
проверить свои и получить новые знания.
cпасибо за поддержку, постараюсь оправдать доверие
Sign up to leave a comment.

Articles