DNX: C#: Task Parallel Library

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.

Cite this article as: Alejandro G. Carlstein Ramos Mejia, "DNX: C#: Task Parallel Library," in Alejandro G. Carlstein Ramos Mejia Blog, September 2, 2015, http://www.acarlstein.com/?p=3186.
Share

Notes: Operative Systems – Part 3

< Previous (Operative Systems – Part 2) | (Operative Systems – Part 4) Next >

NOTIFICATION: These notes are published for educational purposes. Using these notes is under your own responsibility and risk. These notes are given ‘as is’. I do not take responsibilities for how you use them.

PDF Content:

  • System call operation (syscall)
  • Intermediate Library
  • Implementing system calls
  • Kernel modules
  • SysEnter/SysExit method
  • Phony
  • Kernel modules
  • Module control
  • Generic module
  • Device classification
  • Character devices
  • Block devices
  • Network devices
  • Concurrency issues
  • Version numbering
  • GNU General Public Licence (GPL)
  • Memory management
  • Multiprogramming
  • Fixed partition
  • Relocation and protection

Operative_Systems_3

 

< Previous (Operative Systems – Part 2) | (Operative Systems – Part 4) Next >

Share