Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Task unhandle exception / 19 сообщений из 19, страница 1 из 1
11.07.2013, 15:59
    #38328330
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
В книге написано, что если не обработать exception из Таска, то при его ~finalize сборщик кинет исключение и упадет домен.
решил проверить: консоль, FW 4:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private static void Main(string[] args)
		{
			Test();
			GC.WaitForPendingFinalizers();
			GC.Collect();
			GC.WaitForPendingFinalizers();
			GC.WaitForFullGCComplete();
			Console.Read();
		}
		static void Test()
		{
			var t=Task.Factory.StartNew(() =>
			{
				throw new Exception("hellow");
			});
			t = null;
		}


не роняет. Что не так делаю ?:)
...
Рейтинг: 0 / 0
11.07.2013, 16:02
    #38328335
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
netivan,

хотя вот такое роняет:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
static void Test()
		{
			var t=Task.Factory.StartNew(() =>
			{
				throw new Exception("hellow");
			});
			t = null;
			FinalizeClass cls = new FinalizeClass();
			cls = null;
		}

internal class FinalizeClass
	{
		~FinalizeClass()
		{
			throw new Exception("pizdets domeny=)");
		}
	}
...
Рейтинг: 0 / 0
11.07.2013, 16:19
    #38328360
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
FW точно не 4.5 ?
...
Рейтинг: 0 / 0
11.07.2013, 17:14
    #38328439
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
Алексей КFW точно не 4.5 ? абсолютно, VS 2010 все равно 4.5 не держит.
...
Рейтинг: 0 / 0
12.07.2013, 15:08
    #38329527
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
что, никаких мыслей? никого не волнует падение домена?))
...
Рейтинг: 0 / 0
12.07.2013, 16:04
    #38329618
Roslyn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
netivan,


эксепшн будет подавлен, пока ты не обратишься к одному из мемберов Task

например, к t.Result
...
Рейтинг: 0 / 0
12.07.2013, 16:32
    #38329677
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
Roslynnetivan,


эксепшн будет подавлен, пока ты не обратишься к одному из мемберов Task

например, к t.Result
именно. Но финалайзер проверяет, и как раз случай, когда я "не обратился" он сам выкидывает exception.
...
Рейтинг: 0 / 0
13.07.2013, 07:38
    #38330158
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
Ты не даешь времени на то, чтобы task отработал

Thread.Sleep(500);
GC.Collect();
GC.WaitForPendingFinalizers();
...
Рейтинг: 0 / 0
13.07.2013, 07:39
    #38330159
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
...
Рейтинг: 0 / 0
15.07.2013, 16:07
    #38331580
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
SeVa faq
это конечно очень интересно, но вопроса не меняет.
Я не обязан ждать Таск Wait и тд. Но это не значит, что он сам по себе умрет. у Рихтера,например, ясно написано, что деструктор кинет исключение если увидит, что оно не было отловлено/обработано. Что, если я не жду Таск финализатор не выполняется? Бред. Вообщем вопрос открытый, полезу смотреть реализацию.
...
Рейтинг: 0 / 0
15.07.2013, 16:42
    #38331643
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
У меня работает. VS 2010.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    class Program
    {
        static void Main(string[] args)
        {
            TaskScheduler.UnobservedTaskException += (s, e) =>
            {
                Console.WriteLine(e.Exception.InnerException.Message);
                Console.WriteLine(e.Observed);
            };

            Task.Factory.StartNew(() => { throw new Exception("My Exception Message"); });

            Thread.Sleep(1000);

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            Console.ReadKey();
        }
    }
...
Рейтинг: 0 / 0
15.07.2013, 17:52
    #38331791
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
Алексей КУ меня работает. VS 2010.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    class Program
    {
        static void Main(string[] args)
        {
            TaskScheduler.UnobservedTaskException += (s, e) =>
            {
                Console.WriteLine(e.Exception.InnerException.Message);
                Console.WriteLine(e.Observed);
            };

            Task.Factory.StartNew(() => { throw new Exception("My Exception Message"); });

            Thread.Sleep(1000);

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            Console.ReadKey();
        }
    }


а если убрать
Код: c#
1.
2.
3.
4.
5.
 TaskScheduler.UnobservedTaskException += (s, e) =>
            {
                Console.WriteLine(e.Exception.InnerException.Message);
                Console.WriteLine(e.Observed);
            };
...
Рейтинг: 0 / 0
15.07.2013, 18:13
    #38331825
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
netivanа если убрать
Код: c#
1.
2.
3.
4.
5.
 TaskScheduler.UnobservedTaskException += (s, e) =>
            {
                Console.WriteLine(e.Exception.InnerException.Message);
                Console.WriteLine(e.Observed);
            };

На Win8 ничего фатального не происходит. Завтра на WinXP проверю. Может есть отличия...
...
Рейтинг: 0 / 0
15.07.2013, 18:46
    #38331858
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
Алексей Кnetivanа если убрать
Код: c#
1.
2.
3.
4.
5.
 TaskScheduler.UnobservedTaskException += (s, e) =>
            {
                Console.WriteLine(e.Exception.InnerException.Message);
                Console.WriteLine(e.Observed);
            };

На Win8 ничего фатального не происходит. Завтра на WinXP проверю. Может есть отличия...ну должен упасть... попробуйте.
Я даже блок с GC запускал в цикле, бестолку.
...
Рейтинг: 0 / 0
15.07.2013, 19:30
    #38331903
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
Алексей Кnetivanа если убрать
Код: c#
1.
2.
3.
4.
5.
 TaskScheduler.UnobservedTaskException += (s, e) =>
            {
                Console.WriteLine(e.Exception.InnerException.Message);
                Console.WriteLine(e.Observed);
            };

На Win8 ничего фатального не происходит. Завтра на WinXP проверю. Может есть отличия...

Не знаю на счет win8, но в net 4.5 изменили поведение по умолчанию для UnobservedTaskException и ничего падать не будет.

Компилируйте под realese
...
Рейтинг: 0 / 0
15.07.2013, 19:37
    #38331918
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
SeVaАлексей Кпропущено...
На Win8 ничего фатального не происходит. Завтра на WinXP проверю. Может есть отличия...

Не знаю на счет win8, но в net 4.5 изменили поведение по умолчанию для UnobservedTaskException и ничего падать не будет.

Компилируйте под realese
и под FW 4.
...
Рейтинг: 0 / 0
15.07.2013, 20:01
    #38331940
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
netivanSeVaпропущено...


Не знаю на счет win8, но в net 4.5 изменили поведение по умолчанию для UnobservedTaskException и ничего падать не будет.

Компилируйте под realese
и под FW 4.
вот код финалайза..
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
protected override void Finalize()
		{
			try
			{
				if (this.m_faultExceptions != null && !this.m_isHandled && !Environment.HasShutdownStarted && !AppDomain.CurrentDomain.IsFinalizingForUnload() && !TaskExceptionHolder.s_domainUnloadStarted)
				{
					foreach (ExceptionDispatchInfo current in this.m_faultExceptions)
					{
						Exception sourceException = current.SourceException;
						AggregateException ex = sourceException as AggregateException;
						if (ex != null)
						{
							AggregateException ex2 = ex.Flatten();
							using (IEnumerator<Exception> enumerator2 = ex2.InnerExceptions.GetEnumerator())
							{
								while (enumerator2.MoveNext())
								{
									Exception current2 = enumerator2.Current;
									if (current2 is ThreadAbortException)
									{
										return;
									}
								}
								continue;
							}
						}
						if (sourceException is ThreadAbortException)
						{
							return;
						}
					}
					AggregateException ex3 = new AggregateException(Environment.GetResourceString("TaskExceptionHolder_UnhandledException"), this.m_faultExceptions);
					UnobservedTaskExceptionEventArgs unobservedTaskExceptionEventArgs = new UnobservedTaskExceptionEventArgs(ex3);
					TaskScheduler.PublishUnobservedTaskException(this.m_task, unobservedTaskExceptionEventArgs);
					if (TaskExceptionHolder.s_failFastOnUnobservedException && !unobservedTaskExceptionEventArgs.m_observed)
					{
						throw ex3;
					}
				}
			}
			finally
			{
				base.Finalize();
			}
		}
...
Рейтинг: 0 / 0
16.07.2013, 07:18
    #38332155
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
На WinXP нормально падает.
...
Рейтинг: 0 / 0
16.07.2013, 15:24
    #38332987
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task unhandle exception
SeVaАлексей Кпропущено...
На Win8 ничего фатального не происходит. Завтра на WinXP проверю. Может есть отличия...

Не знаю на счет win8, но в net 4.5 изменили поведение по умолчанию для UnobservedTaskException и ничего падать не будет.

Компилируйте под realeseЯ вроде 4.5 не ставил. Может само через Windows Update поставилось.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Task unhandle exception / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]