همزمان کردن برنامه ها، میتواند بخشی حیاتی اطمینان از پاسخگویی خوب و کارایی بالا باشد، اما کالکشنهای استاندارد برای محیطهای همزمان طراحی نشده اند. در دوره ویدیویی C# Concurrent Collections (کالکشنهای همزمان سی شارپ) موسسه Pluralsight که توسط Simon Robinson تدریس شده است، شما نحوهی استفاده از کالکشنهای همزمان را یاد خواهید گرفت تا با فکر کردن در مورد مسئلهها به صورت همزمان، قدرت دستکاری دادهها در کالکشنها در سناریوهای چند نخی را به دست آورید.
ابتدا، یاد خواهید گرفت که چگونه از شرایط مسابقه و خراب شدن دادهها اجتناب کنید و همچنین چگونه از لامبداها و closureها برای انجام عملیات کالکشنهای همزمان به صورت thread-safe استفاده کنید. در ادامه، کالکشنهای تولید کننده-مصرف کننده مانند پشتهها و صفها را بررسی خواهید کرد. سپس یاد خواهید گرفت که چگونه به صورت امن همهی آیتم هایی یک صف را استفاده کنید وقتی که نمیدانید که آیا ممکن است که سایر threadها نیز، آیتمهای دیگری را اضافه کرده باشند. در پایان شما دربارهی شیوههای خوب برنامه نویسی کنکاش خواهید کرد تا کالکشنهای همزمان خود را کارا نگه دارید. در پایان این دوره، شما نحوهی ذخیره بدون خطر دادهها در کالکشنها و اینکه چندین thread به صورت همزمان به آن دادهها دسترسی داشته باشند را درک خواهید کرد؛ ضمن اینکه از باگهای همگام سازی thread که به صورتی دیگر میتوانند کد همزمان را دچار افت کنند اجتناب کنید.
Table of Contents:
- Course Overview
- Course Overview
- Collections and Atomic Operations
- Overview
- Introducing the Code
- Adding Concurrency
- Fixing the Code with ConcurrentQueue<T>
- Inconsistent Results
- Explaining the Thread Timing Inconsistency
- Why Did Queue<T>.Enqueue() Fail?
- Atomic Operations
- Summary
- From Dictionary to ConcurrentDictionary
- Overview
- Introducing the SellShirts Demo
- Storing Shirts in an ImmutableArray
- The Stock Controller and the Dictionary
- Generating Random Numbers
- The Main() Method
- Simulating Serving Customers
- Adding Concurrency and ConcurrentDictionary
- The Indexer vs. TryGetValue()
- Fixing the Code to Allow for Failure
- Remove() vs. TryRemove()
- Concurrent Collection State Can Be Uncertain
- Summary
- ConcurrentDictionary: Avoiding Race Conditions
- Overview
- Introducing the BuyAndSell Demo
- Storing the Stock in a Dictionary
- Updating a Standard Dictionary
- Summing Values with LINQ and Checking for Errors
- Modelling Serving a Customer
- Adding Concurrency
- Race Conditions and Data Corruption
- Updating Atomically with TryUpdate()
- Introducing AddOrUpdate()
- Interlocked.Add()
- Protecting against Race Conditions
- Lambdas to Conditionally Update the Dictionary
- Solving the Update Problem with a Closure
- GetOrAdd() to Read the Dictionary
- Summary
- The Producer-consumer Collections: Queues, Stacks, and Bags
- Overview
- Adding the Logging Tasks
- Calculating Commissions
- Enqueueing to the Concurrent Queue
- Consuming the Queue: The Problem of Polling
- ConcurrentStack<T>
- ConcurrentBag<T>
- The IProducerConsumerCollection<T> Interface
- Summary
- Avoiding Polling with the BlockingCollection
- Overview
- Understanding BlockingCollection<T>
- How BlockingCollection<T> Avoids Polling
- The Consuming Enumerable
- Enumerating Directly Won't Work
- Summary
- Good and Bad Coding Practices with Concurrent Collections
- Overview
- Concurrent Collections and Performance
- The Dictionary Benchmark Demo
- Benchmarking with Multiple Threads
- Running the Benchmark
- Use Shared State Sparingly
- Using ConcurrentDictionary Correctly
- The Problem with Count
- Aggregate State
- Good Practices for State
- Summary
- Enumerating Concurrent Collections
- Overview
- Enumerating a Standard Dictionary
- Enumerating a Concurrent Dictionary
- Forcing a Snapshot Enumeration
- Snapshot Pros and Cons
- Module Summary
- Course Summary
- T-shirt Models: Thank You!
- Your Challenge!