As you may know, Microsoft is getting into the open source community with the ASP.NET and DNX with the mono project.
The .NET Execution Environment (DNX) is a software development kit which allows you to run .NET applications on Windows, Mac, and Linux using different frameworks such as .NET framework, .NET Core, and Mono. However, everything isn’t roses. There are many incomplete libraries, incompatibilities, lack of documentation, and most of the examples such as doing SQL or SOAP do not work depending on which the library targets you are planning to code for. Therefore, I decided to test the basics on all the library targets. I am starting with DNX451.
The task parallel library seems to be working fine in DNX451 with C#. Below is a code example for those who wish to play with it.
Program.cs
using System; using TPL = TaskParallelLibraryExample; namespace ConsoleApp1 { public class Program { public void Main(string[] args){ Console.WriteLine("Main()"); displayWhichDnxIsCompilingOn(); new TPL.TaskParallelLibraryExample(); } private void displayWhichDnxIsCompilingOn(){ #if DNX451 Console.WriteLine("Compiled on DNX451: .NET Framework"); #endif #if DNXCORE50 Console.WriteLine("Compiled on DNXCORE50: .NET Core 5"); #endif } } } |
TaskParallelLibraryExample.cs
using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace TaskParallelLibraryExample { public class TaskParallelLibraryExample { public TaskParallelLibraryExample(){ Console.WriteLine("\nTaskParallelLibraryExample"); // Example 1 var task1 = new Task(() => { Console.WriteLine("Task 1 begins"); Thread.Sleep(1000); Console.WriteLine("Task 1 ends"); }); task1.Start(); DisplayPressAnyKey(); Console.WriteLine("------"); // Example 2 var task2 = new Task(() => { DoTask(2, 1000); }); task2.Start(); DisplayPressAnyKey(); Console.WriteLine("------"); // Example 3 var task3 = new Task(() => { DoTask(3, 1000); }); task3.Start(); var task4 = new Task(() => { DoTask(4, 1000); }); task4.Start(); var task5 = new Task(() => { DoTask(5, 1000); }); task5.Start(); DisplayPressAnyKey(); Console.WriteLine("------"); // Example 4 var task6 = Task.Factory.StartNew(() => { DoTask(6, 1000); }); var task7 = Task.Factory.StartNew(() => { DoTask(7, 1000); }); var task8 = Task.Factory.StartNew(() => { DoTask(8, 1000); }); DisplayPressAnyKey(); Console.WriteLine("------"); // Example 5 var tasks9_10_11 = Task.Factory.StartNew(() => DoTask(9, 1000)) .ContinueWith((prevTask) => DoTask(10,1000)) .ContinueWith((prevTask) => DoTask(11,1000)); DisplayPressAnyKey(); Console.WriteLine("------"); // Example 6 var task12 = Task.Factory.StartNew(() => DoTask(12, 1000)); var task13 = Task.Factory.StartNew(() => DoTask(13, 1000)); var task14 = Task.Factory.StartNew(() => DoTask(14, 1000)); var taskList = new List<Task>{ task12, task13, task14 }; Task.WaitAll(taskList.ToArray()); DisplayPressAnyKey(); Console.WriteLine("------"); // Example 7 var task15 = Task.Factory.StartNew(() => DoTask(15, 1000)); var task16 = Task.Factory.StartNew(() => DoTask(16, 1000)); var task17 = Task.Factory.StartNew(() => DoTask(17, 1000)); for (var i = 0; i < 10; ++i){ Console.WriteLine("Inside task begins"); Thread.Sleep(300); Console.WriteLine("Inside task ends"); } DisplayPressAnyKey(); Console.WriteLine("------"); // Example 8 var task18 = Task.Factory.StartNew(() => DoTask(18, 1000)); var task19 = Task.Factory.StartNew(() => DoTask(19, 1000)); var task20 = Task.Factory.StartNew(() => DoTask(20, 1000)); taskList = new List<Task>{ task18, task19, task20 }; Task.WaitAll(taskList.ToArray()); for (var i = 0; i < 10; ++i){ Console.WriteLine("Inside task again begins"); Thread.Sleep(300); Console.WriteLine("Inside task again ends"); } DisplayPressAnyKey(); Console.WriteLine("------"); // Example 9 var listNames = new List<string> { "Alex", "Diego", "Vanina", "Ariel", "Juan", "David", "Candece", "Pablo", "Agustin"}; Parallel.ForEach(listNames, name => Console.WriteLine(name)); DisplayPressAnyKey(); Console.WriteLine("------"); // Example 10 Parallel.For(0, 100, (number) => Console.Write(number + "->")); Console.WriteLine("\n------"); // Example 11 var cancelSource = new CancellationTokenSource(); try{ var continueTasks = Task.Factory.StartNew(() => DoTask(21, 1000)) .ContinueWith((prevTask) => DoTask(22, 1000)) .ContinueWith((prevTask) => DoAnotherTask(23, 1000, cancelSource.Token)) .ContinueWith((prevTask) => DoTask(24, 1000)); cancelSource.Cancel(); } catch(Exception ex){ Console.WriteLine("Exception: " + ex.GetType()); } Console.WriteLine("\n------"); } private void DisplayPressAnyKey(){ Console.WriteLine("Press any key to quit"); Console.ReadKey(); } private void DoTask(int id, int sleepTimeInMilliSeconds){ Console.WriteLine("Task {0} begins", id); Thread.Sleep(1000); Console.WriteLine("Task {0} ends", id); } private void DoAnotherTask(int id, int sleepTimeInMilliSeconds, CancellationToken token){ if (token.IsCancellationRequested) { Console.WriteLine("Cancellation request"); token.ThrowIfCancellationRequested(); } Console.WriteLine("Another Task {0} begins", id); Thread.Sleep(1000); Console.WriteLine("Another Task {0} ends", id); } } } |
Output:
AGCRM-MacBook-Pro:Examples user$ dnx . me Main() Compiled on DNX451: .NET Framework TaskParallelLibraryExample Press any key to quit Task 1 begins Task 1 ends ------ Press any key to quit Task 2 begins Task 2 ends ------ Press any key to quit Task 4 begins Task 3 begins Task 5 begins Task 4 ends Task 3 ends Task 5 ends ------ Press any key to quit Task 6 begins Task 7 begins Task 8 begins Task 7 ends Task 6 ends Task 8 ends ------ Press any key to quit Task 9 begins Task 9 ends Task 10 begins Task 10 ends Task 11 begins Task 11 ends ------ Task 12 begins Task 13 begins Task 14 begins Task 12 ends Task 13 ends Task 14 ends Press any key to quit ------ Inside task begins Task 17 begins Task 16 begins Task 15 begins Inside task ends Inside task begins Inside task ends Inside task begins Inside task ends Inside task begins Task 16 ends Task 17 ends Task 15 ends Inside task ends Inside task begins Inside task ends Inside task begins Inside task ends Inside task begins Inside task ends Inside task begins Inside task ends Inside task begins Inside task ends Inside task begins Inside task ends Press any key to quit ------ Task 18 begins Task 19 begins Task 20 begins Task 18 ends Task 19 ends Task 20 ends Inside task again begins Inside task again ends Inside task again begins Inside task again ends Inside task again begins Inside task again ends Inside task again begins Inside task again ends Inside task again begins Inside task again ends Inside task again begins Inside task again ends Inside task again begins Inside task again ends Inside task again begins Inside task again ends Inside task again begins Inside task again ends Inside task again begins Inside task again ends Press any key to quit ------ Alex Juan Candece Agustin Pablo Ariel David Diego Vanina Press any key to quit ------ 1->50->51->52->53->54->75->55->76->2->3->4->56->25->26->77->5->6->7->0->8->9->78->57->58->59->10->79->27->28->29->60->11->12->80->30->31->61->14->15->16->17->81->32->33->62->18->19->20->21->34->35->36->82->13->40->41->42->43->44->45->46->47->37->22->23->24->65->66->48->49->83->84->85->86->87->67->90->88->89->63->64->91->92->93->94->95->96->97->98->68->69->38->39->70->71->72->73->74->99-> ------ Task 21 begins ------ Note: Actual output may be different when you run it. |