774
Part II: Exploring the C# Library
synchronization. However, with the release of .NET 4.0, several new synchronization 
alternatives have been added. They are shown here:
Class
Purpose
Barrier
Causes threads to wait at a specified point (called the barrier) until all threads arrive.
CountdownEvent
Raises a signal when a countdown completes.
ManualResetEventSlim
A lightweight version of ManualResetEvent.
SemaphoreSlim
A lightweight version of Semaphore.
If you understand how to use the core synchronization classes described earlier, then 
you will have no trouble using these additions.
Terminating a Thread Via Abort( )
It is sometimes useful to stop a thread prior to its normal conclusion, even when the new 
ead that has 
run wild. Once a thread has been terminated, it is removed from the system and cannot be 
restarted.
To terminate a thread prior to its normal conclusion, use Thread.Abort( ). Its simplest 
form is shown here:
public void Abort( )
Abort( ) causes a ThreadAbortException to be thrown to the thread on which Abort( ) is 
called. This exception causes the thread to terminate. This exception can also be caught by 
your code (but is automatically rethrown in order to stop the thread). Abort( ) may not 
always be able to stop a thread immediately, so if it is important that a thread be stopped 
before your program continues, you will need to follow a call to Abort( ) with a call to Join( ).
Also, in rare cases, it is possible that Abort( ) won’t be able to stop a thread. One way this 
could happen is if a finally block goes into an infinite loop.
The following example shows how to stop a thread by use of Abort( ):
// Stopping a thread by use of Abort().
using System;
using System.Threading;
class MyThread {
public Thread Thrd;
public MyThread(string name) {
Thrd = new Thread(this.Run);
Thrd.Name = name;
Thrd.Start();
}
// This is the entry point for thread.
void Run() {
Console.WriteLine(Thrd.Name + " starting.");
Pdf mail merge plug in - Merge, append PDF files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Provide C# Demo Codes for Merging and Appending PDF Document
combine pdfs online; c# merge pdf files
Pdf mail merge plug in - VB.NET PDF File Merge Library: Merge, append PDF files in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET Guide and Sample Codes to Merge PDF Documents in .NET Project
add pdf files together reader; .net merge pdf files
P
A
R
T
I
I
Chapter 23: Multithreaded Programming, Part One  
775
for(int i = 1; i <= 1000; i++) {
Console.Write(i + " ");
if((i%10)==0) {
Console.WriteLine();
Thread.Sleep(250);
}
}
Console.WriteLine(Thrd.Name + " exiting.");
}
}
class StopDemo {
static void Main() {
MyThread mt1 = new MyThread("My Thread");
Thread.Sleep(1000); // let child thread start executing
Console.WriteLine("Stopping thread.");
mt1.Thrd.Abort();
mt1.Thrd.Join(); // wait for thread to terminate
Console.WriteLine("Main thread terminating.");
}
}
The output from this program is shown here:
My Thread starting.
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
Stopping thread.
Main thread terminating.
N
OTE
N
OTE
Abort( ) should not be used as the normal means of stopping a thread. It is meant for 
specialized situations. Usually, a thread should end because its entry point method returns.
An Abort( ) Alternative
You might find a second form of Abort( ) useful in some cases. Its general form is shown 
here:
public void Abort(object stateInfo)
Here, stateInfo contains any information that you want to pass to the thread when it is 
being stopped. This information is accessible through the ExceptionState property of 
ThreadAbortException. You might use this to pass a termination code to a thread. The 
following program demonstrates this form of Abort( ):
// Using Abort(object).
using System;
using System.Threading;
C# TIFF: Barcode Reading and Scanning from TIFF File in C#.NET
types supported by our C#.NET TIFF Barcode Reader Plug-in. C# PDF-417 Reading from TIFF, C# ISBN Reading from TIFF. C# Intelligent Mail Recognition from TIFF,
acrobat combine pdf files; pdf split and merge
VB.NET Imaging - Data Matrix Plug-in SDK Control
VB Imaging - Data Matrix Generator Plug-in Overview. Creator Add-on can help .NET developers insert Data Matrix barcode into a certain page of PDF, TIFF, Word
c# pdf merge; adding pdf pages together
776
Part II: Exploring the C# Library
class MyThread {
public Thread Thrd;
public MyThread(string name) {
Thrd = new Thread(this.Run);
Thrd.Name = name;
Thrd.Start();
}
// This is the entry point for thread.
void Run() {
try {
Console.WriteLine(Thrd.Name + " starting.");
for(int i = 1; i <= 1000; i++) {
Console.Write(i + " ");
if((i%10)==0) {
Console.WriteLine();
Thread.Sleep(250);
}
}
Console.WriteLine(Thrd.Name + " exiting normally.");
} catch(ThreadAbortException exc) {
Console.WriteLine("Thread aborting, code is " +
exc.ExceptionState);
}
}
}
class UseAltAbort {
static void Main() {
MyThread mt1 = new MyThread("My Thread");
Thread.Sleep(1000); // let child thread start executing
Console.WriteLine("Stopping thread.");
mt1.Thrd.Abort(100);
mt1.Thrd.Join(); // wait for thread to terminate
Console.WriteLine("Main thread terminating.");
}
}
The output is shown here:
My Thread starting.
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
Stopping thread.
Thread aborting, code is 100
Main thread terminating.
C# Imaging - Data Matrix Plug-in SDK Control
C# Imaging - Data Matrix Generator Plug-in Overview. Users can freely embed Data Matrix into various documents including TIFF, PDF, Word, Excel and PowerPoint.
reader combine pdf pages; best pdf combiner
VB.NET Image: VB.NET Codes on How to Scan RM4SCC barcode in .NET
This barcode plug-in component is developed to help users well as other file type such as PDF document, Microsoft postal barcode used by the Royal Mail for the
all jpg to one pdf converter; build pdf from multiple files
P
A
R
T
I
I
Chapter 23: Multithreaded Programming, Part One  
777
As the output shows, the value 100 is passed to Abort( ). This value is then accessed 
through the ExceptionState property of the ThreadAbortException caught by the thread 
when it is terminated.
Canceling Abort( )
A thread can override a request to abort. To do so, the thread must catch the 
ThreadAbortException and then call ResetAbort( ). This prevents the exception 
from being automatically rethrown when the thread’s exception handler ends. 
ResetAbort( ) is declared like this:
public static void ResetAbort( )
A call to ResetAbort( ) can fail if the thread does not have the proper security setting to 
cancel the abort.
The following program demonstrates ResetAbort( ):
// Using ResetAbort().
using System;
using System.Threading;
class MyThread {
public Thread Thrd;
public MyThread(string name) {
Thrd = new Thread(this.Run);
Thrd.Name = name;
Thrd.Start();
}
// This is the entry point for thread.
void Run() {
Console.WriteLine(Thrd.Name + " starting.");
for(int i = 1; i <= 1000; i++) {
try {
Console.Write(i + " ");
if((i%10)==0) {
Console.WriteLine();
Thread.Sleep(250);
}
} catch(ThreadAbortException exc) {
if((int)exc.ExceptionState == 0) {
Console.WriteLine("Abort Cancelled! Code is " +
exc.ExceptionState);
Thread.ResetAbort();
}
else
Console.WriteLine("Thread aborting, code is " +
exc.ExceptionState);
}
}
Console.WriteLine(Thrd.Name + " exiting normally.");
VB.NET Word: Create a Customized Word Rendering & Converting
to contact our technical team via E-mail RasterEdge VB.NET Word converting plug-in allows developers to and bmp, vector image format, like svg, and PDF file are
split pdf into multiple files; pdf combine pages
VB.NET TIFF: VB Code to Read Linear and 2D Barcodes from TIFF
processing add-on and .NET barcode reader plug-in, it Barcode Reading Component allows users scan PDF-417 barcode VB Code to Scan Intelligent Mail from TIFF,
add pdf together; add pdf pages together
778
Part II: Exploring the C# Library
}
}
class ResetAbort {
static void Main() {
MyThread mt1 = new MyThread("My Thread");
Thread.Sleep(1000); // let child thread start executing
Console.WriteLine("Stopping thread.");
mt1.Thrd.Abort(0); // this won’t stop the thread
Thread.Sleep(1000); // let child execute a bit longer
Console.WriteLine("Stopping thread.");
mt1.Thrd.Abort(100); // this will stop the thread
mt1.Thrd.Join(); // wait for thread to terminate
Console.WriteLine("Main thread terminating.");
}
}
The output is shown here:
My Thread starting.
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
Stopping thread.
Abort Cancelled! Code is 0
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
Stopping thread.
Thread aborting, code is 100
Main thread terminating.
In this example, if Abort( ) is called with an argument that equals zero, then the abort 
request is cancelled by the thread by calling ResetAbort( ), and the thread’s execution 
continues. Any other value causes the thread to stop.
Suspending and Resuming a Thread
In early versions of the .NET Framework, a thread could be suspended by calling 
Thread.Suspend( ) and resumed by calling Thread.Resume( ). Today, however, both 
of these methods are marked as obsolete and should not be used for new code. One reason 
is that Suspend( ) is inherently dangerous because it can be used to suspend a thread that is 
currently holding a lock, thus preventing the lock from being released, resulting in deadlock. 
This can cause a systemwide problem. You must use C#’s other synchronization features, 
such as a mutex, to suspend and resume a thread.
VB.NET PowerPoint: VB Codes to Create Linear and 2D Barcodes on
with the ability to combine and merge created barcode is easy to install and integrate Micro PDF-417 barcode to add and create linear Intelligent Mail on any
pdf merge comments; pdf combine
VB.NET Image: Australia Post Barcode Reader & Scanner SDK for VB.
component, developers can easily integrate this strong linear barcode scanner plug-in into NET code; How to read Australia Post barcode image from PDF file by
reader merge pdf; pdf mail merge
P
A
R
T
I
I
Chapter 23: Multithreaded Programming, Part One  
779
Determining a Thread’s State
The state of a thread can be obtained from the ThreadState property provided by Thread.
It is shown here:
public ThreadState ThreadState{ get; }
The state of the thread is returned as a value defined by the ThreadState enumeration. It 
defines the following values:
ThreadState.Aborted
ThreadState.AbortRequested
ThreadState.Background
ThreadState.Running
ThreadState.Stopped
ThreadState.StopRequested
ThreadState.Suspended
ThreadState.SuspendRequested
ThreadState.Unstarted
ThreadState.WaitSleepJoin
All but one of these values is self-explanatory. The one that needs some explanation is 
ThreadState.WaitSleepJoin. A thread enters this state when it is waiting because of a call 
toWait( ),Sleep( ), or Join( ).
Using the Main Thread
As mentioned at the start of this chapter, all C# programs have at least one thread of 
execution, called the mainthread, which is given to the program automatically when it 
begins running. The main thread can be handled just like all other threads.
To access the main thread, you must obtain a Thread object that refers to it. You do this 
through the CurrentThread property, which is a member of Thread. Its general form is 
shown here:
public static Thread CurrentThread{ get; }
This property returns a reference to the thread in which it is used. Therefore, if you use 
CurrentThread while execution is inside the main thread, you will obtain a reference to the 
main thread. Once you have this reference, you can control the main thread just like any 
other thread.
The following program obtains a reference to the main thread and then gets and sets the 
main thread’s name and priority:
// Control the main thread.
using System;
using System.Threading;
class UseMain {
static void Main() {
Thread Thrd;
// Get the main thread.
Thrd = Thread.CurrentThread;
VB.NET Image: VB.NET Codes to Read UPC-A Barcode in .NET Barcoding
A Overview. RasterEdge .NET Image SDK contains a barcode reading plug-in library tiff and bmp currently), and other document formats, such as PDF docuemnt and
pdf merger; merge pdf
C# Imaging - RM4SCC Barcode Generation Tutorial
as CBC (Customer Bar Code) within Royal Mail. RasterEdge Barcode Creator Library Plug-in, a consisting images, along with documents like PDF, Microsoft Office
acrobat reader merge pdf files; add pdf together one file
780
Part II: Exploring the C# Library
// Display main thread’s name.
if(Thrd.Name == null)
Console.WriteLine("Main thread has no name.");
else
Console.WriteLine("Main thread is called: " + Thrd.Name);
// Display main thread’s priority.
Console.WriteLine("Priority: " + Thrd.Priority);
Console.WriteLine();
// Set the name and priority.
Console.WriteLine("Setting name and priority.\n");
Thrd.Name = "Main Thread";
Thrd.Priority = ThreadPriority.AboveNormal;
Console.WriteLine("Main thread is now called: " +
Thrd.Name);
Console.WriteLine("Priority is now: " +
Thrd.Priority);
}
}
The output from the program is shown here:
Main thread has no name.
Priority: Normal
Setting name and priority.
Main thread is now called: Main Thread
Priority is now: AboveNormal
One word of caution: You need to be careful about what operations you perform on the 
main thread. For example, if you add this call to Join( ) to the end of Main( ),
Thrd.Join();
the program will never terminate because it will be waiting for the main thread to end!
Additional Multithreading Features Added by .NET 4.0
Version 4.0 of the .NET Framework adds new multithreading features that you might find 
a mechanism by which a thread can be cancelled easily in a well-defined, structured way. It 
is based on the concept of a cancellation token, which is used to specify the cancellation state 
of a thread. Cancellation tokens are supported by the CancellationTokenSource class and 
theCancellationToken structure. Because the cancellation system is fully integrated into the 
new Task Parallel Library, it is described in Chapter 24, where the TPL is discussed.
System.Threading adds a structure called SpinWait. It provides the methods SpinOnce( )
andSpinUntil( ) that give you greater control over spin waiting. In general, on single-
P
A
R
T
I
I
Chapter 23: Multithreaded Programming, Part One  
781
processor systems, SpinWait will yield. On multiprocessor systems, it will use a loop. Another 
spin-related element is the SpinLock, which uses a loop to wait until a lock is available.
TheThread class adds a method called Yield( ) that simply yields the remainder of a 
thread’s timeslice. It is shown here:
public static bool Yield( )
It returns true if a context switch occurred, and false otherwise. A context switch will not 
occur if there is not another thread that is ready to run.
Multithreading Tips
The key to effectively utilizing multithreading is to think concurrently rather than serially. For 
example, when you have two subsystems within a program that can execute concurrently, 
consider making them into individual threads. A word of caution is in order, however. If you 
create too many threads, you can actually degrade your program’s performance rather than 
enhance it. Remember, there is some overhead associated with context switching. If you create 
too many threads, more CPU time will be spent changing contexts than in executing your 
program! Finally, for new code consider using the Task Parallel Library to accomplish 
multithreading.
Starting a Separate Task
Although thread-based multitasking is what you will use most often when programming 
in C#, it is possible to utilize process-based multitasking where appropriate. When using 
process-based multitasking, instead of starting another thread within the same program, 
one program starts the execution of another program. In C#, you do this by using the 
Process class. Process is defined within the System.Diagnostics namespace. To conclude 
this chapter, a brief look at starting and managing another process is offered.
The easiest way to start another process is to use the Start( ) method defined by Process.
Here is one of its simplest forms:
public static Process Start(string fi leName)
Here, fileName
associated with an executable.
When a process that you create ends, call Close( ) to free the memory associated with 
that process. It is shown here:
public void Close( )
You can terminate a process in two ways. If the process is a Windows GUI application, 
then to terminate the process, call CloseMainWindow( ), shown here:
public bool CloseMainWindow( )
This method sends a message to the process, instructing it to stop. It returns true if the 
message was received. It returns false if the application was not a GUI app, or does not 
have a main window. Furthermore, CloseMainWindow( ) is only a request to shut down. 
If the application ignores the request, the application will not be terminated.
782
Part II: Exploring the C# Library
To positively terminate a process, call Kill( ), as shown here:
public void Kill( )
UseKill( ) carefully. It causes an uncontrolled termination of the process. Any unsaved data 
associated with the process will most likely be lost.
You can wait for a process to end by calling WaitForExit( ). Its two forms are shown here:
public void WaitForExit( )
public bool WaitForExit(int milliseconds)
The first form waits until the process terminates. The second waits for only the specified 
number of milliseconds. The second form returns true if the process has terminated and 
false if it is still running.
The following program demonstrates how to create, wait for, and close a process. It starts 
the standard Windows utility program WordPad.exe. It then waits for WordPad to end.
// Starting a new process.
using System;
using System.Diagnostics;
class StartProcess {
static void Main() {
Process newProc = Process.Start("wordpad.exe");
Console.WriteLine("New process started.");
newProc.WaitForExit();
newProc.Close(); // free resources
Console.WriteLine("New process ended.");
}
}
When you run this program, WordPad will start, and you will see the message, “New 
process started.” The program will then wait until you close WordPad. Once WordPad 
has been terminated, the final message, “New process ended.”, is displayed.
24
Multithreading, Part Two: 
Exploring the Task Parallel 
Library and PLINQ
P
erhaps the most important new feature added to the .NET Framework by version 4.0 
is the Task Parallel Library (TPL). This library enhances multithreaded programming 
in two important ways. First, it simplifies the creation and use of multiple threads. 
Second, it automatically makes use of multiple processors. In other words, by using the TPL 
processors. These two features make the TPL the recommended approach to multithreading 
in most cases.
Another parallel programming feature added by .NET 4.0 is PLINQ, which stands for 
Parallel Language Integrated Query. PLINQ enables you to write queries that automatically 
make use of multiple processors and parallelism when appropriate. As you will see, it is 
trivially easy to request parallel execution of a query. Thus, through the use of PLINQ, it 
is possible to add parallelism to a query with little effort.
The primary reason that TPL and PLINQ are such important advances is because of the 
growing importance of parallelism in modern programming. Today, multicore processors 
are becoming commonplace. Furthermore, the demand for better program performance 
is increasing. As a result, there has been a growing need for a mechanism that enables 
software to take advantage of multiple processors to increase performance. The trouble is 
. The TPL and 
esources.
The TPL is defined in the System.Threading.Tasks namespace. However, when working 
with the TPL, you will also often need to include System.Threading because it provides 
support for synchronization and other multithreading features such as the Interlocked class.
This chapter explores both the TPL and PLINQ. Understand, however, that these are 
lar
is described and several basic techniques are demonstrated. Thus, the information in this 
ogramming, then 
these are areas of the .NET framework that you will want to study in greater detail.
783
CHAPTER
Documents you may be interested
Documents you may be interested