Download - Binary Studio Academy: Concurrency in C# 5.0
![Page 1: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/1.jpg)
Concurrency in C# 5.0Binary Studio Academy
binary-studio.com
![Page 2: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/2.jpg)
Contents
1. Concurrency
2. Multithreading Programming
3. Thread Synchronization4. Parallel Programming5. Collections
6. Asynchronous Programming
7. Cancellation
8. Async Synchronization
9. Exceptions
![Page 3: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/3.jpg)
Concurrency
![Page 4: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/4.jpg)
Asynchronous
![Page 5: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/5.jpg)
Asynchronous
OK
First Name
Last Name
Birthdate Program Storage
![Page 6: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/6.jpg)
Asynchronous
OK
Salary
PercentProgram
Loop
![Page 7: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/7.jpg)
Asynchronous
OK
Salary
PercentProgram
Loop
![Page 8: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/8.jpg)
Multithreading Programming
Main thread
Thread_1 Thread_2 Thread_3
Thread_4 Thread_5 Thread_6Thread_7
Thread_8 Thread_9
![Page 9: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/9.jpg)
Thread
Program
Thread:- Culture- Principals- Priority- Execution Context
![Page 10: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/10.jpg)
Demo
![Page 11: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/11.jpg)
ThreadPool
Program
ThreadPool(10)
Thread1 Thread2
![Page 12: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/12.jpg)
Demo
![Page 13: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/13.jpg)
BackgroundWorker
- DoWork (ReportProgress())- ProgressChanged- RunWorkerCompleted
![Page 14: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/14.jpg)
Demo
![Page 15: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/15.jpg)
Timers
System.Threading.Timer:- callback based- need to dispose
System.Timers.Timer:- event based- thread safety
Timers in depth
![Page 16: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/16.jpg)
Demo
![Page 17: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/17.jpg)
Types Of Threads
● Main Thread (UI Thread)
○ Entry point
○ Sync
● Worker Thread
○ Independent flow
○ Async
![Page 18: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/18.jpg)
Thread Synchronization
![Page 19: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/19.jpg)
Thread Synchronization Primitives
● Lock● Mutex● AutoResetEvent● Semaphore
![Page 20: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/20.jpg)
Demo
![Page 21: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/21.jpg)
Parallel Programming
![Page 22: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/22.jpg)
Data Parallelism
1
2
3
4
5
6
7
Process:y =x * x
1
4
9
16
25
36
49
![Page 23: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/23.jpg)
Task Parallelism
1
2
3
4
5
6
7
Process:Console.WriteLine(collection.Max())
Process:Console.WriteLine(collection.Min())
Process:Console.WriteLine(collection.Average())
Process:Console.WriteLine(collection.Sum())
Task
![Page 24: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/24.jpg)
PLINQ
collection.AsParallel().Where(c => c > 0).ForAll()
(from c in collection.AsParallel()where c > 0select c).ForAll()
![Page 25: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/25.jpg)
Demo
![Page 26: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/26.jpg)
Collections
Immutable CollectionsThread Safe collectionsBlocking CollectionsAsynchronous collections
![Page 27: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/27.jpg)
Immutable Collections
● ImmutableStack<T>● ImmutableQueue<T>● ImmutableList<T>● ImmutableSet<T>● ImmutableDictionary<T, K>
var list = ImmutableList<int>.Empty;list = list.Insert(0, 1);list = list.Add(2);list = list.RemoveAt(0);Console.WriteLine(list[0]);
![Page 28: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/28.jpg)
Thread Safe Collections
● ConcurrentStack<T>● ConcurrentQueue<T>● ConcurrentBag<T>
ConcurrentDictionary<int, string> dictionary = new ConcurrentDictionary<int, string>();
dictionary.AddOrUpdate(k, key => value,(key, oldvalue) => value); // if key exist
![Page 29: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/29.jpg)
Blocking Collections
new BlockingCollection<T>(); // first-in-first-outnew BlockingCollection<T>(new ConcurrentStack<T>()); // last-in-last-outnew BlockingCollection<T>(new ConcurrentBag<T>()); // unordered
Thread1:_bc.Add(1);_bc.Add(2);_blockingQueue.CompleteAdding();
Thread2:foreach(var item in _bc.GetConsumingEnumerable())
Console.WriteLine(item);
![Page 30: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/30.jpg)
Asynchronous Collections
BufferBlock<T>
AsyncProducerConsumerQueue<T>AsyncCollection<T> Nito.AsyncEx
![Page 31: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/31.jpg)
Demo
![Page 32: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/32.jpg)
Asynchronous Programming
OK
First Name
Last Name
Birthdate Program Storage
![Page 33: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/33.jpg)
Asynchronous Programming Model (APM)
● BeginMethod
● Callback
● IAsyncResult
● IAsyncState
● EndMethod
FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None, 8, FileOptions.Asynchronous);string content = "A quick brown fox jumps over the lazy dog";byte[] data = Encoding.Unicode.GetBytes(content);fs.BeginWrite(data, 0, data.Length, OnWriteCompleted, fs);
private static void OnWriteCompleted(IAsyncResult asyncResult) { FileStream fs = (FileStream)asyncResult.AsyncState; fs.EndWrite(asyncResult); fs.Close();}
![Page 34: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/34.jpg)
Event-based Asynchronous Pattern (EAP)
var wc = new WebClient();wc.DownloadStringCompleted += (sender, args) =>{ if (args.Cancelled)
Console.WriteLine ("Canceled"); else if (args.Error != null)
Console.WriteLine ("Exception: " + args.Error.Message); else {
Console.WriteLine (args.Result.Length + " chars were downloaded");
// We could update the UI from here... }};wc.DownloadStringAsync (new Uri ("http://www.linqpad.net")); // Start it
● Event
● EventArgs
● ObjectState
![Page 35: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/35.jpg)
Task-based Asynchronous Pattern (TAP)
public Task<T> MethodNameAsync(…, CancellationToken cancellationToken, IProgress<T> progress);
● Task, Task<T>
● CancellationToken
● IProgress
● syntax support (async/await)
![Page 36: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/36.jpg)
Create task
● new Task(() => return 42).Start()
● TaskFactory.Start(() => return 42)
● Task.Run(() => return 42)
public async Task Method()
{
await Task.Delay(500);
return Task.Run(() => Console.WriteLine(“Async”))
.ContinueWith((t) => Console.WriteLine(“Task finished”));
}
![Page 37: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/37.jpg)
Task Helpers
● Task.WhenAll()
● Task.WhenAny()
● Task.WaitAll()
● Task.WhenAny()
● Task.Delay()
● Task.Run()
● Task.Yield()
![Page 38: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/38.jpg)
ConfigureAwait
Public async void Click(object sender, EventArgs args)
{
var str = await service.DownloadString(Url).ConfigureAwait(false);
UxTextBlock.Text = str; // Runtime Error
}
Public async void Click(object sender, EventArgs args)
{
var str = await service.DownloadString(Url);
UxTextBlock.Text = str;
}
![Page 39: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/39.jpg)
Task Completion Source
EAP
APM
TAP
SetResultSetException
![Page 40: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/40.jpg)
Task Completion Source
public Task UseBackgroundWorker() { var tcs = new TaskCompletionSource<double>(); var backgroundWorker = new BackgroundWorker(); backgroundWorker.DoWork += (o, e) => { Thread.Sleep(2000); e.Result = 42; }; backgroundWorker.RunWorkerCompleted += (o, e) => { if (e.Error != null) { tcs.SetException(e.Error); } else { tcs.SetResult((double)e.Result); } }; return tcs.Task; }
![Page 41: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/41.jpg)
Cancellation
CancellationTokenSource
CancellationTokenSource.Cancel()
CancellationToken
Cancellation.Token.IfCancellationRequested
CancellationToken.ThrowIfCancellationRequest
![Page 42: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/42.jpg)
Demo
![Page 43: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/43.jpg)
Async Synchronization
![Page 44: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/44.jpg)
Lock
Task t;lock{
t = httpClient.GetAsync();}var result = await t;
![Page 45: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/45.jpg)
Async lock
SemaphoreSlim _mutex = new SemaphoreSlim(1);…public async Task Method(){
await _mutex.WaitAsync();try{
var result = await httpClient.GetAsync(Url);}finally{
_mutext.Release();}}
AsyncLock _mutex = new AsyncLock();…public async Task Method(){
using (await _mutex.LockAsync()){
var result = await httpClient.GetAsync(Url);}}
Nito.AsyncEx
![Page 46: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/46.jpg)
Exceptions
Wait()
WaitAll()
WaitAny()
Result
AggregationException
![Page 47: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/47.jpg)
Aggregation Exception
Task task1 = Task.Factory.StartNew(() => LongOperationAsync()); try { task1.Wait(); } catch (AggregateException ae) { ae.Handle((x) => { if (x is MyException) { Console.WriteLine("HandleException."); return true; } return false; }); }
![Page 48: Binary Studio Academy: Concurrency in C# 5.0](https://reader033.vdocument.in/reader033/viewer/2022052606/586fbb6d1a28abe57d8b8a5b/html5/thumbnails/48.jpg)
The end