//
// 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 ProfilingSamples
{
	public class FinallyMain 
	{
		private void FinallyFunction()
		{
			try
			{
				TimeSpan ts = new TimeSpan(Environment.TickCount);
				throw new ApplicationException(string.Format("{0} . . .", ts.ToString()));
			}
			finally
			{
				Console.WriteLine("finally");
			}
		}
		private void FinallyThread()
		{
			while(true)
			{
				try
				{
					FinallyFunction();
				}
				catch(ApplicationException ae)
				{
					Console.WriteLine("FinallyThread restartuje: {0}", ae.Message);
				}
				catch(Exception e)
				{
					Console.WriteLine("FinallyThread przerywa pracę: {0}", e.Message);
					return;
				}
				// Wyjątek będzie zgłaszany co pół sekundy.
				Thread.Sleep(500);
			}
		}
		private void TestThread()
		{
			Thread re = new Thread(new ThreadStart(FinallyThread));
			try
			{
				re.Start();
				Thread.Sleep(Timeout.Infinite);
			}
			catch(Exception e)
			{
				Console.WriteLine("TestThread przerywa pracę: {0}", e.Message);
				re.Abort();
			}
		}
		static void Main(string [] args)
		{
			FinallyMain m = new FinallyMain();
			Thread testThread = new Thread(new ThreadStart(m.TestThread));
			testThread.Start();
			string input = Console.ReadLine();
			testThread.Abort();
			testThread.Join();
		}
	}
}