//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
// 
using System;
using System.Threading;

namespace ThreadExceptions
{
	public delegate int WorkerDelegate();

	public class ExceptionHandlers 
	{
		static void ExceptionFilter(object o, UnhandledExceptionEventArgs e) 
		{
			Console.WriteLine("Wewnątrz ExceptionFilter w wątku: {0} IsTerminating: {1}",
				AppDomain.GetCurrentThreadId(), e.IsTerminating);
		}
		static void ThreadStartCallback() 
		{
			Console.WriteLine("Wewnątrz ThreadStartCallback w wątku {0}", AppDomain.GetCurrentThreadId());
			int result = WorkerThatThrowsException();
			Console.WriteLine("Wewnątrz ThreadStartCallback odpowiedź brzmi {0}", result);
		}
		static int WorkerThatThrowsException() 
		{
			Console.WriteLine("Wewnątrz WorkerThatThrowsException w wątku {0}", AppDomain.GetCurrentThreadId());
			throw new ArgumentException();
			Console.WriteLine("WorkerThatThrowsException zgłasza odpowiedź");
			return 0;
		}
		static void Main() 
		{
			Console.WriteLine("Wewnątrz Main w wątku {0}",
				AppDomain.GetCurrentThreadId());
			AppDomain.CurrentDomain.UnhandledException += new
				UnhandledExceptionEventHandler(ExceptionFilter);

			WorkerDelegate wd = new WorkerDelegate(WorkerThatThrowsException);
			ThreadStart ts = new ThreadStart(ThreadStartCallback);
			Thread t = new Thread(ts);
			t.Start();
			Console.ReadLine();
			Console.WriteLine();
			try 
			{
				int result = wd();
				Console.WriteLine("Wewnątrz Main odpowiedź brzmiała {0}", result);
			} 
			catch (Exception e) 
			{
				Console.WriteLine("Przechwyconow wyjątek w Main:");
				Console.WriteLine(e.ToString());
			}
		}
	}
}
