C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

c# Threads

1 使用多线程情况想必大家都知道拉:更好的界面交互...

2 Advantages of Multiple Threads

Using more than one thread, however, is the most powerful technique available to increase responsiveness to the user and process the data necessary to get the job done at almost the same time. On a computer with one processor, multiple threads can create this effect, taking advantage of the small periods of time in between user events to process the data in the background. For example, a user can edit a spreadsheet while another thread is recalculating other parts of the spreadsheet within the same application.

Without modification, the same application would dramatically increase user satisfaction when run on a computer with more than one processor. Your single application domain could use multiple threads to accomplish the following tasks:

  • Communicate over a network, to a Web server, and to a database.

  • Perform operations that take a large amount of time.

  • Distinguish tasks of varying priority. For example, a high-priority thread manages time-critical tasks, and a low-priority thread performs other tasks.

  • Allow the user interface to remain responsive, while allocating time to background tasks.

3 Disadvantages of Multiple Threads

It is recommended that you use as few threads as possible, thereby minimizing the use of operating-system resources and improving performance. Threading also has resource requirements and potential conflicts to be considered when designing your application. The resource requirements are as follows:

  • The system consumes memory for the context information required by processes, AppDomain objects, and threads. Therefore, the number of processes, AppDomain objects, and threads that can be created is limited by available memory.

  • Keeping track of a large number of threads consumes significant processor time. If there are too many threads, most of them will not make significant progress. If most of the current threads are in one process, threads in other processes are scheduled less frequently.

  • Controlling code execution with many threads is complex, and can be a source of many bugs.

  • Destroying threads requires knowing what could happen and handling those issues.

Providing shared access to resources can create conflicts. To avoid conflicts, you must synchronize, or control the access to, shared resources. Failure to synchronize access properly (in the same or different application domains) can lead to problems such as deadlocks (in which two threads stop responding while each waits for the other to complete) and race conditions (when an anomalous result occurs due to an unexpected critical dependence on the timing of two events). The system provides synchronization objects that can be used to coordinate resource sharing among multiple threads. Reducing the number of threads makes it easier to synchronize resources.

Resources that require synchronization include:

  • System resources (such as communications ports).

  • Resources shared by multiple processes (such as file handles).

  • The resources of a single application domain (such as global, static, and instance fields) accessed by multiple threads.

4 Threading and Application Design

In general, using the ThreadPool class is the easiest way to handle multiple threads for relatively short tasks that will not block other threads and when you do not expect any particular scheduling of the tasks. However, there are a number of reasons to create your own threads:

  • If you need a task to have a particular priority.

  • If you have a task that might run a long time (and therefore block other tasks).

  • If you need to place threads into a single-threaded apartment (all ThreadPool threads are in the multithreaded apartment).

  • If you need a stable identity associated with the thread. For example, you should use a dedicated thread to abort that thread, suspend it, or discover it by name.

  • If you need to run background threads that interact with the user interface, the .NET Framework version 2.0 provides a BackgroundWorker component that communicates using events, with cross-thread marshaling to the user-interface thread.

5 线程的使用方法:
In Win32 In the common language runtime

CreateThread

Combination of Thread and ThreadStart

TerminateThread

Thread.Abort

SuspendThread

Thread.Suspend

ResumeThread

Thread.Resume

Sleep

Thread.Sleep

WaitForSingleObject on the thread handle

Thread.Join

ExitThread

No equivalent

GetCurrentThread

Thread.CurrentThread

SetThreadPriority

Thread.Priority

No equivalent

Thread.Name

No equivalent

Thread.IsBackground

Close to CoInitializeEx (OLE32.DLL)

Thread.ApartmentState

6 线程状态的改变:
Action Resulting new state

Another thread calls System.Thread.Start.

Unchanged

The thread responds to System.Threading.Thread.Startand starts running.

Running

The thread callsSystem.Threading.Thread.Sleep.

WaitSleepJoin

The thread calls System.Threading.Monitor.Wait on another object.

WaitSleepJoin

The thread calls System.Threading.Thread.Join on another thread.

WaitSleepJoin

Another thread calls System.Threading.Thread.Suspend.

SuspendRequested

The thread responds to aSystem.Threading.Thread.Suspend request.

Suspended

Another thread calls System.Threading.Thread.Resume.

Running

Another thread calls System.Threading.Thread.Suspend.

Running

Another thread calls System.Threading.Abort.

AbortRequested

The thread responds to an System.Threading.Abort.

Aborted

7 线程的优先级:
 emun: AboveNormal ...
8 线程的异常:

9 启动带参数的线程:(无参数的更简单,与之类似)
ParameterizedThreadStart Delegate

using  System;
using  System.Threading;

public   class  Work
{
    
public   static   void  Main()
    
{
        
//  To start a thread using a shared thread procedure, use
        
//  the class name and method name when you create the 
        
//  ParameterizedThreadStart delegate.
        
//
        Thread newThread  =   new  Thread(
            
new  ParameterizedThreadStart(Work.DoWork));
        
        
//  Use the overload of the Start method that has a
        
//  parameter of type Object. You can create an object that
        
//  contains several pieces of data, or you can pass any 
        
//  reference type or value type. The following code passes
        
//  the integer value 42.
        
//
        newThread.Start( 42 );

        
//  To start a thread using an instance method for the thread 
        
//  procedure, use the instance variable and method name when 
        
//  you create the ParameterizedThreadStart delegate.
        
//
        Work w  =   new  Work();
        newThread 
=   new  Thread(
            
new  ParameterizedThreadStart(w.DoMoreWork));
        
        
//  Pass an object containing data for the thread.
        
//
        newThread.Start( " The answer. " );
    }

 
    
public   static   void  DoWork( object  data)
    
{
        Console.WriteLine(
" Static thread procedure. Data='{0}' " ,
            data);
    }


    
public   void  DoMoreWork( object  data)
    
{
        Console.WriteLine(
" Instance thread procedure. Data='{0}' " ,
            data);
    }

}


/*  This code example produces the following output (the order 
   of the lines might vary):

Static thread procedure. Data='42'
Instance thread procedure. Data='The answer'
*/



10 控制线程的执行:
using System;
using System.Threading;

public class ThreadControlExample {

    
private static void DisplayMessage() {

        
// Repeatedly display a message to the console.
        while (true{

            
try {

                Console.WriteLine(
"{0} : Second thread running. Enter"
                    
+ " (S)uspend, (R)esume, (I)nterrupt, or (E)xit.",
                    DateTime.Now.ToString(
"HH:mm:ss.ffff"));

                
// Sleep for 2 seconds.
                Thread.Sleep(2000);

            }
 catch (ThreadInterruptedException) {

                
// Thread has been interrupted. Catching the 
                
// ThreadInterruptedException allows the example to 
                
// take appropriate action and continue execution.
                Console.WriteLine("{0} : Second thread interrupted.",
                    DateTime.Now.ToString(
"HH:mm:ss.ffff"));

            }
 catch (ThreadAbortException abortEx) {

                
// The object in the ThreadAbortException.ExceptionState
                
// property is provided by the thread that called 
                
// Thread.Abort. In this case it contains a string that 
                
// describes the reason for the abort.
                Console.WriteLine("{0} : Second thread aborted ({1})",  
                    DateTime.Now.ToString(
"HH:mm:ss.ffff"),
                    abortEx.ExceptionState);

                
// Even though ThreadAbortException has been handled, the
                
// runtime will throw it again to ensure the thread 
                
// terminates.
            }

        }

    }


    
public static void Main() {

        
// Create a new Thread object and pass it a ThreadStart
        
// delegate instance that references DisplayMessage.
        Thread thread = new Thread(new ThreadStart(DisplayMessage));

        Console.WriteLine(
"{0} : Starting second thread.",  
            DateTime.Now.ToString(
"HH:mm:ss.ffff"));

        
// Start the second thread.
        thread.Start();

        
// Loop and process the command entered by the user.
        char command = ' ';

        
do {

            
string input = Console.ReadLine();
            
if (input.Length > 0) command = input.ToUpper()[0];
            
else command = ' ';

            
switch (command) {

                
case 'S':
                    
// Suspend the second thread.
                    Console.WriteLine("{0} : Suspending second thread.",
                        DateTime.Now.ToString(
"HH:mm:ss.ffff"));
                    thread.Suspend();
                    
break;

                
case 'R':
                    
// Resume the second thread.
                    try 
                        Console.WriteLine(
"{0} : Resuming second thread.",
                            DateTime.Now.ToString(
"HH:mm:ss.ffff"));
                        thread.Resume();
                    }
 catch (ThreadStateException) {
                        Console.WriteLine(
"{0} : Thread wasn't suspended.",
                            DateTime.Now.ToString(
"HH:mm:ss.ffff"));
                    }

                    
break;

                
case 'I':
                    
// Interrupt the second thread.
                    Console.WriteLine("{0} : Interrupting second thread.",
                        DateTime.Now.ToString(
"HH:mm:ss.ffff"));
                    thread.Interrupt();
                    
break;

                
case 'E':
                    
// Abort the second thread and pass a state object to
                    
// the thread being aborted, in this case a message.
                    Console.WriteLine("{0} : Aborting second thread.",  
                        DateTime.Now.ToString(
"HH:mm:ss.ffff"));

                    thread.Abort(
"Terminating example.");

                    
// Wait for the second thread to terminate.
                    thread.Join();
                    
break;
            }

        }
 while (command != 'E');

        
// Wait to continue.
        Console.WriteLine("Main method complete. Press Enter.");
        Console.ReadLine();
    }

}

posted on 2006-04-20 18:31 梦在天涯 阅读(1010) 评论(0)  编辑 收藏 引用 所属分类: C#/.NET


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

EMail:itech001#126.com

导航

统计

  • 随笔 - 461
  • 文章 - 4
  • 评论 - 746
  • 引用 - 0

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

积分与排名

  • 积分 - 1795786
  • 排名 - 5

最新评论

阅读排行榜