c#线程初探(一)

c#和.net基类为开发多线程应用程序提供了强大的支持。下面是我看书和结合网上的一些资源整理出来的笔记。因为线程相关的知识比较繁杂和高深(并且本人开发经验欠缺),所以写的很浅显甚至幼稚,理解不妥之处在所难免。
1.怎样创建一个线程(常用的创建方式)

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;

namespace ThreadStudy
{
    
public class MyThreadClass
    {
        
public static void ThreadTest()
        {
            Console.WriteLine(
"This is a thread test.The worker thread is started!");
        }
        
public static void ThreadTestWithParameter(object stateInfo)
        {
            Console.WriteLine(
string.Format("This is {0}.The worker thread is started!", stateInfo));
        }
        
delegate void ThreadTestDelegate(object objName);

        
static ThreadTestDelegate myTest = new ThreadTestDelegate(ThreadTestWithParameter);

        
//线程完成之后回调的函数
        public static void TaskFinished(IAsyncResult result)
        {
            
// myTest.EndInvoke(result); //无返回值
            Console.WriteLine("Thread test callback end.");
        }

        
/* 怎样创建一个线程? */
        
public static void Main()
        {
            
//1.使用Thread类 
            /*a、无参数委托*/
            ThreadStart ts 
= new ThreadStart(ThreadTest); //通过ThreadStart委托(无参数)告诉子线程讲执行什么方法
            Thread currentThread = new Thread(ts);
            currentThread.Name 
= "my first thread test without parameter"//给线程起名字,不是必须的
            currentThread.Start(); //启动新线程
            currentThread.Abort();
            Thread.Sleep(
2000);
            
/*b、带参数委托*/
            ParameterizedThreadStart pts 
= new ParameterizedThreadStart(ThreadTestWithParameter); //通过ParameterizedThreadStart委托(参数)告诉子线程讲执行什么方法
            Thread curThread = new Thread(pts);
            curThread.Name 
= "my first thread test with parameter(s)"//给线程起名字,不是必须的
            curThread.Start("my first thread test with a parameter");//启动新线程,出入一个参数(也可以多个参数)
            curThread.Abort();
            Thread.Sleep(
2000);

            
//2.使用ThreadPool类 
            WaitCallback wcb = new WaitCallback(ThreadTestWithParameter); //通过WaitCallback委托(可以带参数,也可不带参数,这里的实例是带参数的)告诉子线程讲执行什么方法
            ThreadPool.QueueUserWorkItem(wcb, "my first threadpool test");
            ThreadPool.QueueUserWorkItem(ThreadTestWithParameter, 
"my second threadpool test");

            Thread.Sleep(
2000);

            
//3.使用Delegate.BeginInvoke 
            myTest.BeginInvoke("my thread test without callback"nullnull);//此处开始异步执行,如果不需要执行什么后续操作也可以不使用回调

            Thread.Sleep(
2000);

            
//适用于需要传递参数且需要返回参数 
            myTest.BeginInvoke("my thread test with call back"new AsyncCallback(TaskFinished), null);//此处开始异步执行,并且可以给出一个回调函数


            
/* 最后获取当前正在运行的线程的一些信息 */
            Console.WriteLine(Thread.CurrentThread.CurrentCulture.ToString());
            Console.WriteLine(Thread.CurrentThread.CurrentUICulture.ToString());
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());
            Console.WriteLine(Thread.CurrentThread.IsThreadPoolThread.ToString());
            Console.WriteLine(Thread.CurrentThread.IsAlive.ToString());
            Console.WriteLine(Thread.CurrentThread.IsBackground.ToString());
            Console.WriteLine(Thread.CurrentThread.Priority.ToString());

            Console.Read();
        }
    }
}

2.线程的优先级
如果在应用程序中有多个线程在运行,但一些线程比另外的一些线程重要,这时候就要用到线程的优先级。一般情况下,优先级高的线程在工作时,就不会给优先级低的线程分配任何时间片。高优先级的线程可以完全阻止低优先级的线程执行,因此在改变线程优先级的时候要特别小心。
线程的优先级可以定义为枚举ThreadPriority,即Highest,AboveNormal,Normal,BelowNormal和Lowest。

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Threading;

class Program
{
    
static int interval;
    
static void Main()
    {
        Console.WriteLine(
"Please input a number:");
        interval 
= int.Parse(Console.ReadLine());
        Thread curThread 
= Thread.CurrentThread;
        curThread.Name 
= "Main Thread";

        ThreadStart ts 
= new ThreadStart(StartMethod);
        Thread workerThread 
= new Thread(ts);
        workerThread.Name 
= "Worker Thread";
        workerThread.Priority 
= ThreadPriority.AboveNormal; //线程优先级
        workerThread.Start();

        DisplayNumbers();
        Console.WriteLine(
"Main Thread Finished!");

        Console.ReadLine();
    }

    
static void DisplayNumbers()
    {
        Thread thisThread 
= Thread.CurrentThread;
        
string name = thisThread.Name;
        Console.WriteLine(
"Starting Thread:" + name);
        Console.WriteLine(name 
+ ":CurrentCulture=" + thisThread.CurrentCulture);
        
for (int i = 0; i < 6 * interval; i++)
        {
            
if (i % interval == 0)
            {
                Console.WriteLine(name 
+ ":count has reached " + i);
            }
        }
    }

    
static void StartMethod()
    {
        DisplayNumbers();
        Console.WriteLine(
"Worker Thread Finished!");
    }
}

 在下一篇会接着介绍关于c#线程的“同步”相关知识。这里先打住,因为正在看书,还没消化过来^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值