Exemple #1
0
 public TestDelegate()
 {
     delObject = new Del(this.SayHello);
 }
Exemple #2
0
        static void Main(string[] args)
        {
            testa te = new testa();

            te.faccio(3);

            #region opertori
            PippoTest pippoTest  = new PippoTest(1);
            PippoTest pippoTest1 = new PippoTest(2);
            PippoTest pippoTest2 = new PippoTest(2);
            //implicit
            int testt = pippoTest2;
            //explicit
            PippoTest testtt = (PippoTest)3;

            //somma tra pippotest
            var rrrr = pippoTest1 + pippoTest;
            var ssss = pippoTest2++;

            //somma tra int e pippotest
            var ressss = 3 + testtt;
            #endregion

            #region TraceSource

            /*
             * LISTNER
             *
             * ConsoleTraceListener	Standard output or error stream
             * DelimitedListTraceListener	TextWriter
             * EventLogTraceListener	EventLog
             * EventSchemaTraceListener	XML-encoded, schema-compliant log file
             * TextWriterTraceListener	TextWriter
             * XmlWriterTraceListener	XML-encoded data to a TextWriter or stream.
             */
            //configuro da codice
            Stream outfile = File.Create("log.txt");
            //creo listner
            TextWriterTraceListener textWriterTraceListener = new TextWriterTraceListener(outfile);
            TraceSource             traceSource             = new TraceSource("myT", SourceLevels.All);

            //cancello quello di default
            traceSource.Listeners.Clear();
            //aggiungo mio
            traceSource.Listeners.Add(textWriterTraceListener);

            traceSource.TraceInformation("");
            traceSource.TraceEvent(TraceEventType.Critical, 0, "");
            traceSource.TraceData(TraceEventType.Information, 1, "");
            traceSource.Flush();
            traceSource.Close();

            //TraceSource configuro da appsetting
            mySource.TraceEvent(TraceEventType.Error, 1,
                                "Error message.");
            mySource.TraceEvent(TraceEventType.Warning, 2,
                                "Warning message.");

            #endregion

            #region BooleanSwitch
            var sw = new System.Diagnostics.BooleanSwitch("QueryLogger", "QueryLogger");
            if (sw.Enabled)
            {
                Console.WriteLine("Booleanswitchenabled");
            }
            #endregion

            #region TraceSwitch

            /*
             * SourceSwitch e TraceSwitch sono altri due tipi di switch che servono a controllare
             * la verbosità del trace e la “sorgente” del trace.
             * Ovvero, se usi il tracing in maniera seria puoi, grazie al SourceSwitch,
             * definire varie sorgenti di tracing e regolarle a tua discrezione con il TraceSwitch.
             */
            ////Define this in the web config
            TraceSwitch generalSwitch = new TraceSwitch("General",
                                                        "Entire Application");

            string msgText = "1";

            // Write INFO type message, if switch is set to Verbose, type 4
            Trace.WriteIf(generalSwitch.TraceVerbose, msgText);

            msgText = "A2MC";

            // Write INFO type message, if switch is set to Verbose or Warning 4 0r 2
            Trace.WriteIf(generalSwitch.TraceWarning, msgText);

            // Write ERROR type message, if switch is set to Verbose, Warning, info or Error
            // 0 (off), 1 (error), 2 (warning), 3 (info), OR 4 (verbose)
            //If General switch in WEB CONFIG = 0 then it will not get into the if below
            if (generalSwitch.TraceError)
            {
                //Trace type, inthis case error will define how it will appear in the event log
                Trace.TraceError("Error");
                //Use your imagination to switch it on and off properly.
                //You can really imagine and apply.
            }
            #endregion

            #region EventLog
            if (!EventLog.SourceExists("Mysource"))
            {
                EventLog.CreateEventSource("MySource", "MyLog");
            }

            EventLog eventLog = new EventLog();
            eventLog.Source = "MySource";
            eventLog.WriteEntry("Ciao J0n");
            #endregion

            #region PerformanceCounter

            /* CounterCreationDataCollection
             * CounterCreationData (PerformanceCounterType)
             * PerformanceCounterCategory (si prende il collection che si prende il data) (PerformanceCounterCategoryType)
             * PerformanceCounter
             */

            var performanceCounterCategories = PerformanceCounterCategory.GetCategories();
            var first = performanceCounterCategories.FirstOrDefault(category => category.CategoryName == "Processor");

            var performanceCounters = first.GetCounters("_Total");

            Console.WriteLine("Displaying performance counters for Processor category:--\n");

            foreach (PerformanceCounter performanceCounter in performanceCounters)
            {
                Console.WriteLine(performanceCounter.CounterName);
            }

            //v2custom
            String customCategoryName = "Custom Performance Counter Category";
            string counterNameCustom  = "pippo";
            if (!PerformanceCounterCategory.Exists(customCategoryName))
            {
                CounterCreationDataCollection counterCreationDataCollection = new CounterCreationDataCollection();
                counterCreationDataCollection.Add(new CounterCreationData(counterNameCustom, "Sample Counter 1", PerformanceCounterType.ElapsedTime));
                //counterCreationDataCollection.Add(new CounterCreationData("Counter 2", "Sample Counter 2", PerformanceCounterType.SampleCounter));
                PerformanceCounterCategory.Create(customCategoryName, "This is just an example", PerformanceCounterCategoryType.SingleInstance, counterCreationDataCollection);
                var counter = new PerformanceCounter(customCategoryName, counterNameCustom, false);
                counter.Increment();
            }
            using (var counter = new PerformanceCounter(customCategoryName, counterNameCustom, false))
            {
                counter.Increment();
            }

            //v2custom
            string counterName  = "countername";
            string categoryName = "categoryname";
            if (!PerformanceCounterCategory.Exists("categoryname"))
            {
                CounterCreationDataCollection datacollection = new CounterCreationDataCollection();

                CounterCreationData numberOfItems = new CounterCreationData();
                numberOfItems.CounterType = PerformanceCounterType.NumberOfItems32;
                numberOfItems.CounterName = counterName;
                datacollection.Add(numberOfItems);

                // Create the category.
                PerformanceCounterCategory.Create(categoryName,
                                                  "Demonstrates usage of the AverageTimer32 performance counter type",
                                                  PerformanceCounterCategoryType.SingleInstance, datacollection);

                var counter = new PerformanceCounter(categoryName, counterName, false);

                counter.RawValue = 0;
                counter.Increment();
            }
            using (var counter = new PerformanceCounter(categoryName, counterName, false))
            {
                counter.Increment();
            }
            #endregion

            #region  OOP
            MyMethodCond();

            string main = "Main";
            Trace.Write("trace");
            Debug.Write("debug");
            Debug.Assert(main == "Main");

            Ciccio c = new Ciccio();
            c.Prova();
            ICiccio s = (ICiccio)c;
            s.Prova();
            ICiccio1 s1 = (ICiccio1)c;
            s1.Prova();
            c.Nano();

            double xxx = 0.0;
            double yyy = 0.0;
            //var reszzzz = xxx / yyy;NAN
            IIbabbo babbo11 = new Figliolo();
            babbo11.MioMetodo();

            Mio("ciao");
            Mio("ciao", paperino: 1);
            Mio("ciao", pluto: true, paperino: 1);
            //Mio("ciao",pluto:false,1);ERRORE
            //Pippo pippos = new Pippo();
            //pippos.DoSOmething();

            #endregion

            #region  GENERZIONE DINAMICA CODICE

            /*
             *
             * //System.Reflection.Emit
             * //creazione , lancio e salvataggoi IL a runtime
             * AssemblyName nameAss = new AssemblyName("DynamicAss");
             * AssemblyBuilder assemblyBuilder =
             *  AppDomain.CurrentDomain.DefineDynamicAssembly(nameAss, AssemblyBuilderAccess.RunAndSave);
             * ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicMod", "DynamicAss.dll");
             * //classe
             * TypeBuilder tb = moduleBuilder.DefineType("HelloClass", TypeAttributes.Class | TypeAttributes.Public);
             * //metodo
             * MethodBuilder mb =
             *  tb.DefineMethod("PrintHello", MethodAttributes.Public, null, new Type[] { typeof(string) });
             * ILGenerator myGenerator = mb.GetILGenerator();
             * myGenerator.Emit(OpCodes.Ldstr, "Hello");
             * myGenerator.Emit(OpCodes.Ldarg_1);
             * MethodInfo concatMetod = typeof(String).GetMethod("Concat", new Type[] { typeof(string), typeof(string) });
             * myGenerator.Emit(OpCodes.Call, concatMetod);
             * MethodInfo wrMethodInfo = typeof(Console).GetMethod("Write", new Type[] { typeof(string) });
             * myGenerator.Emit(OpCodes.Call, wrMethodInfo);
             * myGenerator.Emit(OpCodes.Ret);
             *
             * //istanzio ogetto
             * Type helloType = tb.CreateType();
             * object helloobj = Activator.CreateInstance(helloType);
             * MethodInfo hellMethodInfo = helloType.GetMethod("PrintHello", new[] { typeof(string) });
             *
             * //invoco metodo passando parametro
             * hellMethodInfo.Invoke(helloobj, new object[] { "J0n" });
             *
             * //salvo dll
             * assemblyBuilder.Save("DynamicAss.dll");
             #endregion
             *
             * HelloClass  helloClass = new HelloClass();
             * helloClass.PrintHello("ciao");
             */


            //System.CodeDom
            //creare  salvare e compilare  codice sorgente e runtime
            CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
            CodeNamespace   codeNamespace   = new CodeNamespace("CodeDOM");
            codeNamespace.Imports.Add(new CodeNamespaceImport("System"));
            //classe
            CodeTypeDeclaration myclass = new CodeTypeDeclaration("Pippo");

            //metodo
            CodeMemberMethod codeMemberMethod = new CodeMemberMethod();
            codeMemberMethod.Name       = "DoSOmething";
            codeMemberMethod.Attributes = MemberAttributes.Public;
            CodeMethodInvokeExpression codeMethodInvokeExpression = new CodeMethodInvokeExpression(
                new CodeTypeReferenceExpression("Console"), "WriteLine", new CodePrimitiveExpression("Ciao Ciccio"));
            CodeMethodInvokeExpression codeMethodInvokeExpression1 = new CodeMethodInvokeExpression(
                new CodeTypeReferenceExpression("Console"), "ReadLine");
            codeCompileUnit.Namespaces.Add(codeNamespace);
            codeNamespace.Types.Add(myclass);
            myclass.Members.Add(codeMemberMethod);
            codeMemberMethod.Statements.Add(codeMethodInvokeExpression);
            codeMemberMethod.Statements.Add(codeMethodInvokeExpression1);

            //salva codice sorgente
            CSharpCodeProvider provider = new CSharpCodeProvider();

            string pathSource = @"../../bin/Debug/Pippo.cs";
            string pathOut    = @"../../bin/Debug/Pippos.dll";

            //string pathSource = @"../../autogenerated/Pippo.cs";
            //string pathOut = @"../../autogenerated/Pippos.exe";
            using (StreamWriter stream = new StreamWriter(pathSource, false))
            {
                IndentedTextWriter tw = new IndentedTextWriter(stream, "   ");
                provider.GenerateCodeFromCompileUnit(codeCompileUnit, tw, new CodeGeneratorOptions());
                tw.Close();
            }

            CompileCSharpCode(pathSource, pathOut);

            #endregion

            #region reflection
            //REFLECTION System.Assembly
            //assembly (IL codice compilato) exe/dll
            //carico in memoria assembly

            //PLUGIN
            //caricamento dinamico  assembly da path
            Assembly assm = Assembly.LoadFrom(@"C:\Users\rob\source\repos\Exam\Plugin1\bin\Debug\Plugin1.dll");
            Type[]   tips = assm.GetTypes();
            foreach (var item in tips)
            {
                //var objectType = Type.GetType(objectToInstantiate);
                Type objectType         = assm.GetType(item.FullName);
                var  instantiatedObject = Activator.CreateInstance(objectType);
            }
            //carica solo metadati dei tipi SENZA instanziare i tipi
            Assembly ass2 = Assembly.ReflectionOnlyLoadFrom("ClassLibrary1.dll");

            //var instantiatedObject1 = Activator.CreateInstance(typeof(Tipo));
            //var instantiatedObject2 = Activator.CreateInstance<Tipo>;
            string sss = new String(new char[3]);
            //assembly attualmente in esecuzione
            Assembly ass             = Assembly.GetExecutingAssembly();
            Assembly ass1            = Assembly.GetAssembly(typeof(string));
            Assembly ass12           = Assembly.GetAssembly(sss.GetType());
            var      mytype          = ass.GetType("ConsoleApp1.Program");
            var      fullname        = ass.FullName;
            var      nome            = mytype.Name;
            var      mytypeNamespace = mytype.Namespace;

            var typeinfo = typeof(MiaclasseProva).GetTypeInfo();
            var name     = typeinfo.FullName;

            //ottengo tipo classe
            MiaclasseProva miaclasseProva = new MiaclasseProva();

            var typeinfo1 = miaclasseProva.GetType().GetTypeInfo();

            //ottengo interafccia
            var interfaccie = typeinfo1.GetInterfaces();

            //ottengo metodi e parametri
            MethodInfo[] metodi = typeinfo1.GetMethods(BindingFlags.Instance);
            foreach (var metodo in metodi)
            {
                var pi = metodo.GetParameters();
                foreach (var parinfo in pi)
                {
                    Console.WriteLine($" parametro : {parinfo.ParameterType.Name}");
                }
            }

            //ottengo membri
            MemberInfo[] membri = typeinfo1.GetMembers(BindingFlags.Public | BindingFlags.NonPublic);
            foreach (var mambro in membri)
            {
                var mi = mambro.MemberType;
            }
            #endregion

            #region IComparable
            //confrontare oggetti
            ComparableMoto comparableMoto = new ComparableMoto();
            comparableMoto.Targa = "pippo";
            ComparableMoto comparableMoto1 = new ComparableMoto();
            comparableMoto1.Targa = "pluto";

            int ord = comparableMoto.CompareTo(comparableMoto1);

            List <ComparableMoto> comparableMotos = new List <ComparableMoto>();
            comparableMotos.Add(new ComparableMoto()
            {
                Targa = "A"
            });
            comparableMotos.Add(new ComparableMoto()
            {
                Targa = "B"
            });
            comparableMotos.Add(new ComparableMoto()
            {
                Targa = "C"
            });
            comparableMotos.Sort();

            //AppDomain.CurrentDomain.UnhandledException += OnUnhandleException;
            //ManageException manage = new ManageException();
            //manage.GeneroEccezioneNonGestita();
            #endregion

            #region ref out static class
            Figlio   figlio1  = new Figlio();
            Figlio   figlio   = new Figlio("as");
            Macchina macchina = new Macchina("320", "bmw");
            macchina.Parti();
            SmartPhone.Battery     battery = new SmartPhone.Battery();
            ConstructorStaticClass constructorStaticClass = new ConstructorStaticClass();
            ConstructorStaticClass miaclasse2             = new ConstructorStaticClass();
            Console.WriteLine(ConstructorStaticClass.contatore);
            ClassTest1 babbo   = new ClassTest1();
            var        testref = 0;
            double     resp2;
            double     resp3;

            //ref
            babbo.cambiaNumero(ref testref);
            //out scarta valore resp3
            babbo.potenza(2, out resp2, out _);
            var media = babbo.CalcolaMedia(18, 27, 27, 27);
            babbo.ParametriNome(nome: "rob", anni: 43);

            //c#7
            //double xresp2;
            //double xresp3;
            //babbo.potenza1(2,  xresp2,  xresp3);

            int x1 = 0;
            //block
            if (x1 == 0)//expression
            {
                //codice
            }

            int?    nullable = null;
            var     cliente  = new { nome = "rob" };
            Mesi    giorno   = Mesi.febbraio;
            int     mese     = (int)Mesi.febbraio;
            Mesi    mese1    = (Mesi)1;
            Pippolo pippo;
            pippo.a = 1;


            #endregion

            #region cast box unbox
            //cast
            int     i     = 123;
            object  box   = i;
            int     n     = (int)box;//unbox
            dynamic dd    = 1;
            int     inc   = dd + 1;
            var     ssss1 = Convert.ToString(1);
            dynamic dy    = new ExpandoObject();
            #endregion

            #region type

            //OTTENGO IL TIPO
            //GetType
            var  ti = typeof(string).GetTypeInfo();
            Type ts = Type.GetType("System.String");//se si trova in Mscorelib.dll

            TestClass tc   = new TestClass();
            Type      tipo = tc.GetType();

            //typeof
            Type type = typeof(Type);

            //CONTROLLO IL TIPO
            //is tipo | as tipo
            string obj = "";
            if (obj is string)
            {
                //cast ()
                string a  = (string)obj;   //se obj non è compatibile con string cast exception
                string a1 = obj as string; //se obj non compatobole con string ritorna null
            }


            #endregion

            #region array
            Console.WriteLine($"metodo {nameof(Main)}");

            /*
             * stack => vet
             * heap 1
             * heap 2
             * heap 3
             *
             * ARRAY MULTID:
             * -array rettangoli
             * 1234
             * 1234
             *
             * -array jagged (irregolare)
             * 123456
             * 234
             * 2343434343
             */

            //array
            int[] vet = new[] { 1, 2, 3 };

            //array regolari matrici
            int[,] matrix = new int[3, 4];
            matrix[0, 0]  = 1;

            int[,] matrix1 =
            {
                { 1, 2, 3, 4 },
                { 5, 6, 7, 8 }
            };

            //jagged array irregolari
            int[][] jagged = new int[3][];
            jagged[0] = new int[2] {
                1, 2
            };
            jagged[1] = new int[4] {
                1, 2, 3, 4
            };
            #endregion

            #region c7 PATTERN MATCHING

            /*
             * type => espr is tipo v
             * const => espr is constante
             * var
             *
             * */

            //type
            object obj1 = "";
            if (obj1 is string str)
            {
                Console.WriteLine(str);
            }

            //invece che

            if (obj1 is string)
            {
                string str1 = (string)obj;
                Console.WriteLine(str1);
            }

            //const
            Mesi giornomese = Mesi.febbraio;
            bool feb        = giornomese is Mesi.febbraio;//true se giorno di febbraio

            #endregion

            #region  Event
            //Event
            Pub pub = new Pub();
            //mi iscrivo e gli dico di fare questo quando viene sollevato evento evento
            pub.OnChange += () => Console.WriteLine("lambda");
            pub.OnChange += delegate { Console.WriteLine("delegate"); };

            //sollevo evento
            pub.Raise();

            Pub1 p1 = new Pub1();
            p1.OnChange += () => Console.WriteLine("lambda");
            p1.Raise();

            Pub2 p2 = new Pub2();
            p2.CreateAndRaise();

            Car        car = new Car();
            CarMonitor cm  = new CarMonitor(car);

            car.Decelerate();

            #endregion

            #region Expression Tree
            //Expression Tree
            Expression <Func <int, bool> > exp1 = x => x % 2 == 0;
            Func <int, bool> isPari             = exp1.Compile();//dopo che l'ho compliat posso eseguirla, prima era solo un albero di espressopmo
            if (isPari(4))
            {
                Console.WriteLine("pari");
            }
            #endregion

            #region delegate

            //assegno lambda (anonyous method)
            myDelegate myd = (x) => 1;
            Console.WriteLine(myd("0ciao"));

            //assegno metodo
            myDelegate myd1 = MethodForDel;
            Console.WriteLine(myd1("1ciao"));

            //assegno delegate
            myDelegate myd2 = delegate { return(1); };
            Console.WriteLine(myd2("2ciao"));
            #endregion

            #region VARIANZA
            //COVARIANZA OUT
            //ti faccio assegnare sia metodo che ritorna stringa
            //ma anche metodo che torna object perchè stringa deriva
            //da object (è piu specifica)
            Del          d1   = new Del();
            Cov <string> cov  = d1.Cov1;
            Cov <object> cov1 = d1.Cov2;
            Cov <object> cov3 = d1.Cov2;
            //Cov<string> cov2 = d1.Cov2;//no object non deriva da stringa

            //CONTROVARIANZA IN
            //ti faccio assegnare sia metodo che prende ingresso
            //classe piu generica object  ma ache classe piu specifica string
            Con <object> con  = d1.Con1;
            Con <string> con3 = d1.Con1;
            Con <string> con1 = d1.Con2;
            //Con<object> con2 = d1.Con2;//no

            var res3 = d1.MyCon(Convert.ToInt32, "5");
            var res4 = d1.MyCon1(Convert.ToInt32, "5");
            var res5 = d1.MyConGen(Convert.ToInt32, "5");
            var res6 = d1.MyConGen(Convert.ToBoolean, 0);
            var res7 = d1.MyConGen(Convert.ToString, 5);
            Console.WriteLine(res3);
            Console.WriteLine(res4);

            d1.UseMulticast();

            #endregion

            #region generics
            Task tx1 = Task.Run(() =>
            {
                Console.WriteLine("ciao");
            });
            Task[] tasksarr = new Task[1];
            tasksarr[0] = tx1;

            Gen1 gen1 = new Gen1();

            if (gen1.GetDefault <ConstructorStaticClass, Task>(tx1) != null)
            {
                gen1.ContinueTaskOrDefault(tx1, Console.WriteLine);
                Console.WriteLine("start task generic");
            }

            var mytaskList = gen1.ContinueTasksOrDefault(tasksarr, Console.WriteLine);


            if (mytaskList != null)
            {
                Console.WriteLine("starts tasks generic");
            }


            Gen2 <Constructor>             gen2       = new Gen2 <Constructor>();
            Gen2Figlia <Constructor>       gen2figlia = new Gen2Figlia <Constructor>();
            Gen1Figlia <Constructor, Task> tesFiglia  = new Gen1Figlia <Constructor, Task>();

            //variabile statico è diverso per tipo
            TestStaticGen <string> .Status = "rob";
            TestStaticGen <int> .Status    = 1;
            Console.WriteLine(TestStaticGen <string> .Status);
            Console.WriteLine(TestStaticGen <int> .Status);

            TestStatic.Status = "ciao";
            TestStatic.Status = "ciau";
            Console.WriteLine(TestStatic.Status);
            //

            Generica <string, int, DateTime, bool> gen = new Generica <string, int, DateTime, bool>();


            List <Lista <string> > genericiInnestati = new List <Lista <string> >();
            genericiInnestati.Add(new Lista <string>(5));
            genericiInnestati[0][0] = "ciao";
            genericiInnestati[0][1] = "come ";
            genericiInnestati[0][2] = "stai";
            genericiInnestati[0][3] = "rob";
            genericiInnestati[0][4] = "?";

            foreach (var item in genericiInnestati)
            {
                for (int j = 0; j < 5; j++)
                {
                    Console.WriteLine(item[j]);
                }
            }

            Lista <string> lista = new Lista <string>(5);
            lista[0] = "";
            #endregion

            #region programmazione parallela
            //PLINQ solo linq to onject NO linq to sql
            //prende base dati la divide in segmenti e fa query in parallelo su questi segmentie  pio unisce iriaultati
            // se i lavori nonn sono complessi e la base dati è minima la programmazione parallela non da buoni risultati
            var qy = from num in Enumerable.Range(1, 8).AsParallel()
                     select Math.Pow(2, num);

            //stampa da 1 a 9 (9 numeri NON in ordine)
            //iterazioni indipendenti l'una dall altra quindi per tutti e due ordine non è sequnziale
            Parallel.For(1, 10, g => Console.WriteLine("g-{0}", g));
            var result = Parallel.For(0, 50, (g, parallelLoopState) =>
            {
                if (g > 5)
                {
                    parallelLoopState.Break();
                }
            });

            if (!result.IsCompleted)
            {
                var o = result.LowestBreakIteration;
            }

            //non è sequnziale
            List <string> list = new List <string>()
            {
                "ciao", "come", "va?"
            };
            Parallel.ForEach(list, word => Console.WriteLine("{0}", word, word.Length));
            #endregion

            #region async await

            var res1 = DoCurlAsync();

            //net 4.5
            //await salva lo stato del contesto del caller e quando il metodo await si conclude
            //il contesto ritorna allo stato del chimante che puo eseguire il codice successivo
            //questo nel caso di ui permette di modiicare la ui che  proprieta nella app gui del thread
            //della ui e viene eseguito nel ui syncronization context (dispatchercontext nella ui)
            //DAL C#7 TUTTO PUO ESSERE AWAITABLE ED ESEGUITO AINCRONO E NON  SOLO ISTANZA DI TASK
            //QUALSIAIS OGGETTO CHE ESPONE METODO GETAWAITER INFATTI LA CLASSE TASK ESPONE METODO GETAWAITER
            //await non puo essere usato su unsafe, lock, main
            MetodoAsyn();
            Console.WriteLine("codice prima fine await)");

            Task <string> res = GetAsync();

            List <string> files = new List <string>()
            {
                "pippo.txt", "pippo1.txt"
            };
            files.ForEach(async file => await ReadFileAsync(file));

            //all block
            //.Wait()
            //.Result
            //.GetAwaiter()
            //.GetResult()

            #endregion

            #region task tpl

            //manca continuewhenall
            //continuewheany
            //task figli innestati

            //Task.WaitAll blocks the current thread until everything has completed.
            //Task.WhenAll returns a task which represents the action of waiting until everything has completed.
            //That means that from an async method, you can use:
            // A DIFFERENZA DI WAIT ALL TORNA SOLO LA PRIMA ECCEZIONE NON AGGREGATE
            Task[] tasksArray = new Task[3];
            tasksArray[0] = Task.Run(() => { Thread.Sleep(4000); });
            tasksArray[1] = Task.Run(() => { Thread.Sleep(4000); });
            tasksArray[2] = Task.Run(() => { Thread.Sleep(4000); });
            var ry = MyAsyncWhenAll(tasksArray);
            Console.WriteLine("tornato da MyAsyncWhenAll");


            Task tx = Task.Run(() =>
            {
                Thread.Sleep(1000);
            });
            Task ty = Task.Run(() =>
            {
                Thread.Sleep(1000);
            });

            Task taskall = Task.WhenAll((new Task[] { tx, ty }));

            //Task taskall = Task.WhenAny((new Task[] { t1, t2 }));
            taskall.Wait();

            Task <String> webtask = Task.Run(() =>
            {
                string url   = "http://www.google.it";
                WebClient wc = new WebClient();
                return(wc.DownloadString(url));
            });

            Task <String> headhtml = webtask.ContinueWith <string>(x =>
            {
                var res2 = x.Result;
                //fai qualcosa con res
                return(res2);
            });

            var tokenSource         = new CancellationTokenSource();
            CancellationToken token = tokenSource.Token;

            Task cancellabletask = null;
            try
            {
                cancellabletask = Task.Run(() =>
                {
                    token.ThrowIfCancellationRequested();
                    for (int d = 0; d < 2; d++)
                    {
                        Thread.Sleep(100);
                        if (token.IsCancellationRequested)
                        {
                            //eseguo altre cose
                            token.ThrowIfCancellationRequested();
                        }
                    }
                }, token);

                tokenSource.CancelAfter(1000);
                cancellabletask.Wait();
            }
            catch (AggregateException aggregateException)
            {
                if (aggregateException.InnerException is OperationCanceledException)
                {
                    Console.WriteLine("OperationCanceledException£");
                }
                if (cancellabletask != null && (cancellabletask.IsCanceled && cancellabletask.Status == TaskStatus.Canceled))
                {
                    Console.WriteLine(aggregateException.ToString());
                }
            }


            Task <String> task = Task.Run(() =>
            {
                string url   = "http://www.google.it";
                WebClient wc = new WebClient();
                return(wc.DownloadString(url));
            });
            var htmlUrl = task.Result;//blocco

            List <Task> tasks = new List <Task>();
            for (int r = 0; r < 5; r++)
            {
                int number = r;
                tasks.Add(
                    Task.Run(() =>
                {
                    Console.WriteLine(number);
                    Thread.Sleep(1000);
                }));
            }

            //Task.WaitAll(tasks.ToArray());
            Task.WaitAny(tasks.ToArray());
            Console.WriteLine("all task complete");

            Task longtask = Task.Run(() =>
            {
                Thread.Sleep(1000);
            });
            longtask.Wait(1000);


            Task verylong = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(2000);
            }, TaskCreationOptions.LongRunning);
            #endregion tpl

            #region thread
            for (int w = 0; w < 5; w++)
            {
                ThreadPool.QueueUserWorkItem(LongOperation);
            }


            Thread threada = new Thread(IncrMon);
            Thread threadb = new Thread(IncrMon);
            threada.Start();
            threadb.Start();
            threada.Join();
            threadb.Join();
            Console.WriteLine("n={0}", n2);

            Thread thread1 = new Thread(Incr);
            Thread thread2 = new Thread(Incr);
            thread1.Start();
            thread2.Start();
            thread1.Join();
            thread2.Join();
            Console.WriteLine("n={0}", n1);

            Thread t = new Thread(() =>
            {
                Console.WriteLine(Thread.CurrentThread.Name);
                Thread.Sleep(1000);
            });

            Thread t1 = new Thread(() =>
            {
                Console.WriteLine(Thread.CurrentThread.Name);
                for (int z = 0; z < 10; z++)
                {
                    lock (lockobj)
                    {
                        n = n + 1;
                        Thread.Sleep(1);
                        Console.WriteLine("n={0}", n);
                    }
                }
            });
            Thread t2 = new Thread(() =>
            {
                Console.WriteLine(Thread.CurrentThread.Name);
                for (int x = 0; x < 10; x++)
                {
                    lock (lockobj)
                    {
                        n = n + 1;
                        Thread.Sleep(1);
                        Console.WriteLine("n={0}", n);
                    }
                }
            });

            t.IsBackground = true;                       //termina appena finisce la app
            t.Priority     = ThreadPriority.AboveNormal; //determinata quantita di cpu destinata al thread ma non è deterministico
            t.Start();
            t1.Start();
            t2.Start();
            t.Join();//il codice si blocca e attende che t finisce

            #endregion

            Console.ReadLine();
        }