Multithreading in C# 5.0 Cookbook - Evgenii Agafonov - E-Book

Multithreading in C# 5.0 Cookbook E-Book

Evgenii Agafonov

0,0
39,59 €

-100%
Sammeln Sie Punkte in unserem Gutscheinprogramm und kaufen Sie E-Books und Hörbücher mit bis zu 100% Rabatt.

Mehr erfahren.
Beschreibung

In an age when computer processors are being developed to contain more and more cores, multithreading is a key factor for creating scalable, effective, and responsive applications. If you fail to do it correctly, it can lead to puzzling problems that take a huge amount of time to resolve. Therefore, having a solid understanding of multithreading is a must for the modern application developer. Multithreading in C# 5.0 Cookbook is an easy-to-understand guide to the most puzzling programming problems. This book will guide you through practical examples dedicated to various aspects of multithreading in C# on Windows and will give you a good basis of practical knowledge which you can then use to program your own scalable and reliable multithreaded applications. This book guides you through asynchronous and parallel programming from basic examples to practical, real-world solutions to complex problems. You will start from the very beginning, learning what a thread is, and then proceed to learn new concepts based on the information you get from the previous examples.

After describing the basics of threading, you will be able to grasp more advanced concepts like Task Parallel Library and C# asynchronous functions. Then, we move towards parallel programming, starting with basic data structures and gradually progressing to the more advanced patterns. The book concludes with a discussion of the specifics of Windows 8 application programming, giving you a complete understanding of how Windows 8 applications are different and how to program asynchronous applications for Windows 8.

Das E-Book können Sie in Legimi-Apps oder einer beliebigen App lesen, die das folgende Format unterstützen:

EPUB
MOBI

Seitenzahl: 266

Veröffentlichungsjahr: 2013

Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Table of Contents

Multithreading in C# 5.0 Cookbook
Credits
About the Author
About the Reviewers
www.PacktPub.com
Support files, eBooks, discount offers and more
Why Subscribe?
Free Access for Packt account holders
Preface
What this book covers
What you need for this book
Who this book is for
Conventions
Reader feedback
Customer support
Downloading the example code
Errata
Piracy
Questions
1. Threading Basics
Introduction
Creating a thread in C#
Getting ready
How to do it...
How it works...
Pausing a thread
Getting ready
How to do it...
How it works...
Making a thread wait
Getting ready
How to do it...
How it works...
Aborting a thread
Getting ready
How to do it...
How it works...
Determining a thread state
Getting ready
How to do it...
How it works...
Thread priority
Getting ready
How to do it...
How it works...
Foreground and background threads
Getting ready
How to do it...
How it works...
Passing parameters to a thread
Getting ready
How to do it...
How it works...
There's more…
Locking with a C# lock keyword
Getting ready
How to do it...
How it works...
Locking with a Monitor construct
Getting ready
How to do it...
How it works...
Handling exceptions
Getting ready
How to do it...
How it works...
2. Thread Synchronization
Introduction
Performing basic atomic operations
Getting ready
How to do it...
How it works...
Using the Mutex construct
Getting ready
How to do it...
How it works...
Using the SemaphoreSlim construct
Getting ready
How to do it...
How it works...
There's more…
Using the AutoResetEvent construct
Getting ready
How to do it...
How it works...
Using the ManualResetEventSlim construct
Getting ready
How to do it...
How it works...
There's more…
Using the CountDownEvent construct
Getting ready
How to do it...
How it works...
Using the Barrier construct
Getting ready
How to do it...
How it works...
Using the ReaderWriterLockSlim construct
Getting ready
How to do it...
How it works...
Using the SpinWait construct
Getting ready
How to do it...
How it works...
3. Using a Thread Pool
Introduction
Invoking a delegate on a thread pool
Getting ready
How to do it...
How it works...
Posting an asynchronous operation on a thread pool
Getting ready
How to do it...
How it works...
Thread pool and the degree of parallelism
Getting ready
How to do it...
How it works...
Implementing a cancellation option
Getting ready
How to do it...
How it works...
Using a wait handle and timeout with a thread pool
Getting ready
How to do it...
How it works...
There's more…
Using a timer
Getting ready
How to do it...
How it works...
Using the BackgroundWorker component
Getting ready
How to do it...
How it works...
4. Using Task Parallel Library
Introduction
Creating a task
Getting ready
How to do it...
How it works...
Performing basic operations with a task
Getting ready
How to do it...
How it works...
Combining tasks together
Getting ready
How to do it...
How it works...
Converting the APM pattern to tasks
Getting ready
How to do it...
How it works...
Converting the EAP pattern to tasks
Getting ready
How to do it...
How it works...
Implementing a cancellation option
Getting ready
How to do it...
How it works...
Handling exceptions in tasks
Getting ready
How to do it...
How it works...
There's more…
Running tasks in parallel
Getting ready
How to do it...
How it works...
Tweaking tasks execution with TaskScheduler
Getting ready
How to do it...
How it works...
5. Using C# 5.0
Introduction
Using the await operator to get asynchronous task results
Getting ready
How to do it...
How it works...
Using the await operator in a lambda expression
Getting ready
How to do it...
How it works...
Using the await operator with consequent asynchronous tasks
Getting ready
How to do it...
How it works...
Using the await operator for the execution of parallel asynchronous tasks execution
Getting ready
How to do it...
How it works...
Handling exceptions in the asynchronous operations
Getting ready
How to do it...
How it works...
Avoid using the captured synchronization context
Getting ready
How to do it...
How it works...
Working around the async void method
Getting ready
How to do it...
How it works...
Designing a custom awaitable type
Getting ready
How to do it...
How it works...
Using the dynamic type with await
Getting ready
How to do it...
How it works...
6. Using Concurrent Collections
Introduction
Using ConcurrentDictionary
Getting ready
How to do it...
How it works...
Implementing asynchronous processing using ConcurrentQueue
Getting ready
How to do it...
How it works...
Changing asynchronous processing order ConcurrentStack
Getting ready
How to do it...
How it works...
Creating a scalable crawler with ConcurrentBag
Getting ready
How to do it...
How it works...
Generalizing asynchronous processing with BlockingCollection
Getting ready
How to do it...
How it works...
7. Using PLINQ
Introduction
Using the Parallel class
Getting ready
How to do it...
How it works...
Parallelizing a LINQ query
Getting ready
How to do it...
How it works...
Tweaking the parameters of a PLINQ query
Getting ready
How to do it...
How it works...
Handling exceptions in a PLINQ query
Getting ready
How to do it...
How it works...
Managing data partitioning in a PLINQ query
Getting ready
How to do it...
How it works...
Creating a custom aggregator for a PLINQ query
Getting ready
How to do it...
How it works...
8. Reactive Extensions
Introduction
Converting a collection to asynchronous Observable
Getting ready
How to do it...
How it works...
Writing custom Observable
Getting ready
How to do it...
How it works...
Using Subjects
Getting ready
How to do it...
How it works...
Creating an Observable object
Getting ready
How to do it...
How it works...
Using LINQ queries against the observable collection
Getting ready
How to do it...
How it works...
Creating asynchronous operations with Rx
Getting ready
How to do it...
How it works...
9. Using Asynchronous I/O
Introduction
Working with files asynchronously
Getting ready
How to do it...
How it works...
Writing an asynchronous HTTP server and client
Getting ready
How to do it...
How it works...
Working with a database asynchronously
Getting ready
How to do it...
How it works...
Calling a WCF service asynchronously
Getting ready
How to do it...
How it works...
10. Parallel Programming Patterns
Introduction
Implementing Lazy-evaluated shared states
Getting ready
How to do it...
How it works...
Implementing Parallel Pipeline with BlockingCollection
Getting ready
How to do it...
How it works...
Implementing Parallel Pipeline with TPL DataFlow
Getting ready
How to do it...
How it works...
Implementing Map/Reduce with PLINQ
Getting ready
How to do it...
How it works...
11. There's More
Introduction
Using a timer in a Windows Store application
Getting ready
How to do it...
How it works...
Using WinRT from usual applications
Getting ready
How to do it...
How it works...
Using BackgroundTask in Windows Store applications
Getting ready
How to do it...
How it works...
Index

Multithreading in C# 5.0 Cookbook

Multithreading in C# 5.0 Cookbook

Copyright © 2013 Packt Publishing

All rights reserved. No part of this book may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, without the prior written permission of the publisher, except in the case of brief quotations embedded in critical articles or reviews.

Every effort has been made in the preparation of this book to ensure the accuracy of the information presented. However, the information contained in this book is sold without warranty, either express or implied. Neither the author, nor Packt Publishing, and its dealers and distributors will be held liable for any damages caused or alleged to be caused directly or indirectly by this book.

Packt Publishing has endeavored to provide trademark information about all of the companies and products mentioned in this book by the appropriate use of capitals. However, Packt Publishing cannot guarantee the accuracy of this information.

First published: November 2013

Production Reference: 1191113

Published by Packt Publishing Ltd.

Livery Place

35 Livery Street

Birmingham B3 2PB, UK.

ISBN 978-1-84969-764-4

www.packtpub.com

Cover Image by Aniket Sawant (<[email protected]>)

Credits

Author

Eugene Agafonov

Reviewers

Mickael Ferrer

Chad McCallum

Philip Pierce

Acquisition Editor

James Jones

Lead Technical Editor

Chalini Snega Victor

Technical Editors

Menza Mathew

Pooja Nair

Copy Editors

Brandt D'Mello

Mradula Hegde

Gladson Monteiro

Sayanee Mukherjee

Aditya Nair

Karuna Narayanan

Kirti Pai

Laxmi Subramanian

Project Coordinator

Apeksha Chitnis

Proofreader

Clyde Jenkins

Indexer

Marriammal Chettiyar

Production Coordinator

Pooja Chiplunkar

Cover Work

Pooja Chiplunkar

About the Author

Eugene Agafonov leads a web development department at ABBYY, and lives and works in Moscow. He has over 15 years of professional experience in software development and started to work with C# from the time it was in its beta version. He is a Microsoft MVP in ASP.NET since 2006, and he often speaks at local software development conferences, such as TechEd Russia, about cutting-edge technologies in the Modern Web and server-side application development. His main professional interests are cloud-based software architecture, scalability, and reliability. Eugene is a huge fan of football and plays the guitar with a local rock band. You can reach him at his personal blog eugeneagafonov.com or with his twitter handle @eugene_agafonov.

About the Reviewers

Mickael Ferrer is a geek who has played with a lot of technologies through the years; He is the jack of all trades, but master of none.He specialized in .Net and C# development, in particular, for extending Excel.He spent much of his short professional career in the financial industry as a front-office developer.He recently started a self-employed training business for .Net developers.He randomly writes stuff on his technical blog at pragmateek.com

Chad McCallum is a Saskatchewan computer geek and an ASP.NET MVP with over seven years of .NET experience. After graduating from the Computer Systems Technology course at SIAST in Saskatoon, he picked up contracting until he could pester iQmetrix to give him a job, where he's been for the last seven years. He had a brief stint in Vancouver, working on interactive retail software. Since then, he's come back to Regina, SK, where he's started HackREGINA, a hackathon organization aimed at strengthening the developer community while coding and drinking beer. Somehow, between his real-life job and sleep, he managed to publish a Pluralsight course on 10 Ways to Build Web Services in .NET. His current focus is on single-page applications with JavaScript. Between random app ideas, he tries to learn a new technology every week; you can see the results on www.rtigger.com.

Philip Pierce is a software developer with twenty years of experience in mobile, web, desktop, and server development, database design and management, and game development. His background includes creating A.I. for games and business software, converting AAA games among various platforms, developing multithreaded applications, and creating patented client/server communication technologies.

Philip has won several hackathons, including Best Mobile App at the AT&T Developer Summit 2013, and a runner up for Best Windows 8 App at PayPal's Battlethon Miami. His most recent project was converting Rail Rush and Temple Run 2 from the Android platform to Arcade platforms.

Philip's portfolios can be found at http://www.rocketgamesmobile.com and http://www.philippiercedeveloper.com.

www.PacktPub.com

Support files, eBooks, discount offers and more

You might want to visit www.PacktPub.com for support files and downloads related to your book.

Did you know that Packt offers eBook versions of every book published, with PDF and ePub files available? You can upgrade to the eBook version at www.PacktPub.com and as a print book customer, you are entitled to a discount on the eBook copy. Get in touch with us at <[email protected]> for more details.

At www.PacktPub.com, you can also read a collection of free technical articles, sign up for a range of free newsletters and receive exclusive discounts and offers on Packt books and eBooks.

http://PacktLib.PacktPub.com

Do you need instant solutions to your IT questions? PacktLib is Packt's online digital book library. Here, you can access, read and search across Packt's entire library of books.

Why Subscribe?

Fully searchable across every book published by PacktCopy and paste, print and bookmark contentOn demand and accessible via web browser

Free Access for Packt account holders

If you have an account with Packt at www.PacktPub.com, you can use this to access PacktLib today and view nine entirely free books. Simply use your login credentials for immediate access.

To my dearly beloved wife Helen and son Nikita

Preface

Not so long ago, a typical personal computer CPU had only one computing core, and the power consumption was enough to cook fried eggs on it. In 2005, Intel introduced its first multiple-core CPU, and since then computers started developing in a different direction. Low power consumption and a number of computing cores became more important than a row computing core performance. This lead to programming paradigm changes as well. Now we need to learn how to use all CPU cores effectively to achieve the best performance, and at the same time, save battery power by running only the programs we need at a particular time. Besides that, we need to program server applications in a way to use multiple CPU cores or even multiple computers as efficiently as possible to support as many users as we can.

To be able to create such applications, you have to learn to use multiple CPU cores in your programs effectively. If you use the Microsoft .NET development platform and C# programming language, this book will be a perfect starting point for programming applications that have good performance and responsiveness.

The purpose of this book is to provide you with a step-by-step guide for multithreading and parallel programming in C#. We will start with the basic concepts, going through more and more advanced topic based on the information from previous chapters, and end with real-world parallel programming patterns and Windows Store application samples.

What this book covers

Chapter 1, Threading Basics, introduces basic operations with threads in C#. It explains what a thread is, the pros and cons of using threads, and other important thread aspects.

Chapter 2, Thread Synchronization, describes thread interaction details. You will learn why we need to coordinate threads together and the different ways of organizing thread coordination.

Chapter 3, Using a Thread Pool, explains a thread pool concept. It shows how to use a thread pool, how to work with asynchronous operations, and good and bad practices of using a thread pool.

Chapter 4, Using Task Parallel Library, is a deep dive into a Task Parallel Library framework. This chapter outlines every important aspect of TPL, including tasks combination, exceptions management, and operations cancellation.

Chapter 5, Using C# 5.0, explains in detail the new C# 5.0 feature – asynchronous methods. You will find out what async and await keywords mean, how to use them in different scenarios, and how await works under the hood.

Chapter 6, Using Concurrent Collections, describes standard data structures for parallel algorithms included in the .NET Framework. It goes through sample programming scenarios for each data structure.

Chapter 7, Using PLINQ, is a deep dive into the Parallel LINQ infrastructure. The chapter describes task and data parallelism, parallelizing a LINQ query, tweaking parallelism options, partitioning a query, and aggregating parallel query result.

Chapter 8, Reactive Extensions, explains how and when to use the Reactive Extensions framework. You will learn how to compose events and how to perform a LINQ query against an event sequence.

Chapter 9, Using Asynchronous I/O, covers in detail the asynchronous I/O process including files, networks, and database scenarios.

Chapter 10, Parallel Programming Patterns, outlines the common parallel programming problem solutions.

Chapter 11, There's More, covers the aspects of programming asynchronous applications for Windows 8. You will learn how to work with Windows 8 asynchronous APIs, and how to perform background work in Windows Store applications.

What you need for this book

For most of the recipes, you will need Microsoft Visual Studio Express 2012 for Windows Desktop. Recipes in Chapter 11 will require Windows 8 and Microsoft Visual Studio Express 2012 for Windows 8 to compile Windows Store applications.

Who this book is for

Multithreading in C# 5.0 Cookbook is written for existing C# developers with little or no background in multithreading, and asynchronous and parallel programming. The book covers these topics from basic concepts to complicated programming patterns and algorithms using C# and .NET ecosystem.

Reader feedback

Feedback from our readers is always welcome. Let us know what you think about this book—what you liked or may have disliked. Reader feedback is important for us to develop titles that you really get the most out of.

To send us general feedback, simply send an e-mail to <[email protected]>, and mention the book title via the subject of your message.

If there is a topic in which you have expertise, and you are interested in either writing or contributing to a book, see our author guide on www.packtpub.com/authors.

Customer support

Now that you are the proud owner of a Packt book, we have a number of things to help you to get the most from your purchase.

Downloading the example code

You can download the example code files for all Packt books you have purchased from your account at http://www.packtpub.com. If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have the files e-mailed directly to you.

Errata

Although we have taken every care to ensure the accuracy of our content, mistakes do happen. If you find a mistake in one of our books—maybe a mistake in the text or the code—we would be grateful if you would report this to us. By doing so, you can save other readers from frustration and help us improve subsequent versions of this book. If you find any errata, please report them by visiting http://www.packtpub.com/submit-errata, selecting your book, clicking on the erratasubmissionform link, and entering the details of your errata. Once your errata are verified, your submission will be accepted and the errata will be uploaded on our website, or added to any list of existing errata, under the Errata section of that title. Any existing errata can be viewed by selecting your title from http://www.packtpub.com/support.

Piracy

Piracy of copyright material on the Internet is an ongoing problem across all media. At Packt, we take the protection of our copyright and licenses very seriously. If you come across any illegal copies of our works, in any form, on the Internet, please provide us with the location address or website name immediately so that we can pursue a remedy.

Please contact us at <[email protected]> with a link to the suspected pirated material.

We appreciate your help in protecting our authors, and our ability to bring you valuable content.

Questions

You can contact us at <[email protected]> if you are having a problem with any aspect of the book, and we will do our best to address it.

Chapter 1. Threading Basics

In this chapter, we will cover the basic tasks for working with threads in C#. You will learn about:

Creating a thread in C#Pausing a threadMaking a thread waitAborting a threadDetermining thread stateThread priorityForeground and background threadsPassing parameters to a threadLocking with a C# lock keywordLocking with a Monitor constructHandling exceptions

Introduction

At some point of time in the past, the common computer had only one computing unit and could not execute several computing tasks simultaneously. However, operating systems could already work with multiple programs simultaneously, implementing the concept of multitasking. To prevent the possibility of one program taking control of the CPU, forever causing other applications and the operating system itself to hang, the operating systems had to split a physical computing unit across a few virtualized processors in some way and give a certain amount of computing power to each executing program. Moreover, an operating system must always have priority access to the CPU and should be able to prioritize CPU access to different programs. A thread is an implementation of this concept. It could be considered a virtual processor given to the one specific program that runs it independently.

Note

Remember that a thread consumes a significant amount of operating system resources. Trying to share one physical processor across many threads will lead to a situation where an operating system is busy just managing threads instead of running programs.

Therefore, while it was possible to enhance computer processors, making them execute more and more commands per second, working with threads was usually an operating system task. There was no sense in trying to compute some tasks in parallel on a single-core CPU because it would take more time than running those computations sequentially. However, when processors started to have more computing cores, older programs could not take advantage of this because they just used one processor core.

To use a modern processor's computing power effectively, it is very important to be able to compose a program in a way that it can use more than one computing core, which leads to organizing it as several threads communicating and synchronizing with each other.

The recipes in this chapter will focus on performing some very basic operations with threads in the C# language. We will cover a thread's lifecycle, which includes creating, suspending, making a thread wait, and aborting a thread, and then we will go through basic synchronization techniques.