中线程的用法,使用102线程的二种艺术示例详解


正文转发自:http://www.jb51.net/article/46234.htm

因而信托的艺术创制线程

本文章重要介绍了c#选拔十二线程的两种方式,通过示范学习c#的拾二线程使用方法,大家参考使用呢


(一)不供给传递参数,也不必要回到参数

 

ThreadStart是叁个委托,那些委托的概念为void
ThreadStart(),未有参数与重返值。

static int sum(int x)

复制代码 代码如下:

{

class Program

return x+x;

{

{

static void Main(string[] args)

Func<int> a = sum;

{

创办三个新的线程格式:a.BeginInvoke(拾);

for (int i = 0; i < 30; i++)

获得三个线程的重回值:IAsyncResult ar = a.BeginInvoke(10,null,null);  

{

  //第壹种方法 IAsyncResult ar = a.BeginInvoke(10,OnCallback,a);

ThreadStart threadStart = new ThreadStart(Calculate);

  //第三种格局,使用lanmba表明式,例如:

Thread thread = new Thread(threadStart);

    /* IAsyncResult ar = */ a.BeginInvoke(10,ar=>

thread.Start();

    {

}

      int res = a.EndInvoke(ar);

Thread.Sleep(2000);

      Console.WriteLine(res);

Console.Read();

    },null)

}

  第叁个null参数代表回调函数,例如:

public static void Calculate()

    static void OnCallback(IAsyncResult ar)

{

    {

DateTime time = Date提姆e.Now;//得到当今天子

      第三个null参数是回调函数字传送递的数量,例如:

Random ra = new Random();//随机数对象

      Func<int> a = ar.AsyncState as Func<int>;  //
把ar.AsyncState类型转换为Func<int>类型的对象

Thread.Sleep(ra.Next(拾,十0));//随机休眠一段时间

    }

Console.WriteLine(time.Minute + “:” + time.Millisecond);

收获线程重回值的意况:ar.IsCompleted的回到值true为线程甘休,false为线程还未甘休。

}

得到线程的推行的结果:int res = a.EndInvoke(ar);

}

 

(2)必要传递单个参数


ParameterThreadStart委托定义为void ParameterizedThreadStart(object
state),有一个参数不过未有再次回到值。

用Thread创造线程

复制代码 代码如下:

始建线程:Thread t = new Thread(Function);  //
Function为须求运营二个新的线程来施行的函数

class Program

开发银行线程:t.Start();  //
假使Function有参数(必须是Object类型),则Function的参数由Start函数来传递

{

获取线程ID:Thread.CurrentThread.ManagedThreadId

static void Main(string[] args)

 

{

也能够协调写二个类,例如:

for (int i = 0; i < 30; i++)

class MyThread

{

{

ParameterizedThreadStart tStart = new
ParameterizedThreadStart(Calculate);

  private string fileName;

Thread thread = new Thread(tStart);

  private string filePath;

thread.Start(i*十+拾);//传递参数

  public MyThread(string filename,string filepath)

}

  {

Thread.Sleep(2000);

    this.fileName = filename;

Console.Read();

    this.filePath   = filepath;

}

  }

public static void Calculate(object arg)

  public void DownFile(string filename,string filepath)

{

  {

Random ra = new Random();//随机数对象

    Console.WriteLine(“正在下载:”+filepath+filename);

Thread.Sleep(ra.Next(10, 100));//随机休眠壹段时间

    ……

Console.WriteLine(arg);

    Console.WriteLine(“下载达成”);

}

  }

}

}

(叁)使用尤其的线程类(常用)

在program中调用

使用线程类能够有七个参数与多个再次回到值,1贰分心灵手巧!

MyThread myt = new MyThread(“filename”,”filepath”);

复制代码 代码如下:

Thread t = new Thread(myt.Down);

class Program

t.Start();

{

设置后台线程的点子,例如:t.IsBackground = true;

static void Main(string[] args)

线程分为前台线程与后台线程,后台线程会伴随着前台线程的终止而被威胁结束

{

强制截至2个线程:t.Abort();

MyThread mt = new MyThread(100);

先期实施的线程:t.Join();  //
暂停当前先后,先进行t.Join()然后再举办当前未执行完的线程

ThreadStart threadStart = new ThreadStart(mt.Calculate);

 

Thread thread = new Thread(threadStart);

C#中的线程池

thread.Start();

C#中早就封装好了1个线程池ThreadPool,在双核的尺度下私下认可10贰二个干活线程,和一千个I/O线程。全体线程为后台线程

   //等待线程结束

调用线程池的点子:ThreadPool.QueueUserWorkItem(Function);  //
Function为自定义函数,那么些函数要有1个object类型的一个参数

while (thread.ThreadState != ThreadState.Stopped)

 像三个正值运行的线程加锁的用法:lock(加锁的对象);

{

 

Thread.Sleep(10);

 

}

Console.WriteLine(mt.Result);//打字与印刷重回值

Console.Read();

}

}

public class MyThread//线程类

{

public int Parame { set; get; }//参数

public int Result { set; get; }//返回值

//构造函数

public MyThread(int parame)

{

this.Parame = parame;

}

//线程执行格局

public void Calculate()

{

Random ra = new Random();//随机数对象

Thread.Sleep(ra.Next(拾, 拾0));//随机休眠壹段时间

Console.WriteLine(this.Parame);

this.Result = this.Parame * ra.Next(10, 100);

}

}

(肆)使用匿名格局(常用)

接纳匿有名的模特式运营线程能够有四个参数和再次回到值,而且选用越发方便!

复制代码 代码如下:

class Program

{

static void Main(string[] args)

{

int Parame = 拾0;//当做参数

int Result = 0;//当做重回值

//匿名方法

ThreadStart threadStart = new ThreadStart(delegate()

{

Random ra = new Random();//随机数对象

Thread.Sleep(ra.Next(十, 100));//随机休眠一段时间

Console.WriteLine(Parame);//输出参数

Result = Parame * ra.Next(十, 拾0);//计算重返值

});

Thread thread = new Thread(threadStart);

thread.Start();//八线程运转匿名方式

//等待线程甘休

while (thread.ThreadState != ThreadState.Stopped)

{

Thread.Sleep(10);

}

Console.WriteLine(Result);//打字与印刷再次回到值

Console.Read();

}
}

(五)使用委托开启二十三十二线程(10二线程浓密)

一、用委托(Delegate)的BeginInvoke和EndInvoke方法操作线程

BeginInvoke方法可以使用线程异步地实行委托所针对的办法。然后经过EndInvoke方法获得格局的重返值(EndInvoke方法的再次回到值正是被调用方法的再次回到值),或是明确方法已经被成功调用。

复制代码 代码如下:

class Program

{

private delegate int NewTaskDelegate(int ms);

private static int newTask(int ms)

{

Console.WriteLine(“任务初步”);

Thread.Sleep(ms);

Random random = new Random();

int n = random.Next(10000);

Console.WriteLine(“职分成功”);

return n;

}

static void Main(string[] args)

{

NewTaskDelegate task = newTask;

IAsyncResult asyncResult = task.BeginInvoke(2000, null, null);

//EndInvoke方法将被堵塞二秒

int result = task.EndInvoke(asyncResult);

Console.WriteLine(result);

Console.Read();

}

}

二、使用IAsyncResult.IsCompleted属性来判定异步调用是不是到位

复制代码 代码如下:

class Program

{

private delegate int NewTaskDelegate(int ms);

private static int newTask(int ms)

{

Console.WriteLine(“职务伊始”);

Thread.Sleep(ms);

Random random = new Random();

int n = random.Next(10000);

Console.WriteLine(“任务完毕”);

return n;

}

static void Main(string[] args)

{

NewTaskDelegate task = newTask;

IAsyncResult asyncResult = task.BeginInvoke(2000, null, null);

//等待异步执行到位

while (!asyncResult.IsCompleted)

{

Console.Write(“*”);

Thread.Sleep(100);

}

// 由于异步调用已经实现,因而, EndInvoke会即刻回去结果

int result = task.EndInvoke(asyncResult);

Console.WriteLine(result);

Console.Read();

}

}

三、使用WaitOne方法等待异步方法执行到位

WaitOne的首先个参数表示要等待的皮秒数,在内定时间之内,WaitOne方法将一贯等待,直到异步调用完毕,并产生布告,WaitOne方法才回来true。当等待钦命时间之后,异步调用仍未完结,WaitOne方法重返false,假若内定时间为0,表示不等待,若是为-壹,表示永远等待,直到异步调用完毕。

复制代码 代码如下:

class Program

{

private delegate int NewTaskDelegate(int ms);

private static int newTask(int ms)

{

Console.WriteLine(“职分早先”);

Thread.Sleep(ms);

Random random = new Random();

int n = random.Next(10000);

Console.WriteLine(“职务到位”);

return n;

}

static void Main(string[] args)

{

NewTaskDelegate task = newTask;

IAsyncResult asyncResult = task.BeginInvoke(2000, null, null);

//等待异步执行到位

while (!asyncResult.AsyncWaitHandle.WaitOne(100, false))

{

Console.Write(“*”);

}

int result = task.EndInvoke(asyncResult);

Console.WriteLine(result);

Console.Read();

}

}

四、使用回调形式赶回结果

要留意的是“my.BeginInvoke(三,300, MethodCompleted,
my)”,BeginInvoke方法的参数字传送递情势:

前方一部分(三,300)是其委托小编的参数。

尾数第二个参数(MethodCompleted)是回调方法委托项目,他是回调方法的委托,此委托未有重返值,有2个IAsyncResult类型的参数,当method方法执行完后,系统会自行调用MethodCompleted方法。

末段3个参数(my)须求向MethodCompleted方法中传递一些值,1般能够传递被调用方法的寄托,那个值能够使用IAsyncResult.AsyncState属性得到。

复制代码 代码如下:

class Program

{

private delegate int MyMethod(int second, int millisecond);

//线程执行措施

private static int method(int second, int millisecond)

{

Console.WriteLine(“线程休眠” + (second * 1000 + millisecond) + “毫秒”);

Thread.Sleep(second * 1000 + millisecond);

Random random = new Random();

return random.Next(10000);

}

//回调方法

private static void MethodCompleted(IAsyncResult asyncResult)

{

if (asyncResult == null || asyncResult.AsyncState == null)

{

Console.WriteLine(“回调失利!!!”);

return;

}

int result = (asyncResult.AsyncState as
MyMethod).EndInvoke(asyncResult);

Console.WriteLine(“义务到位,结果:” + result);

}

static void Main(string[] args)

{

MyMethod my = method;

IAsyncResult asyncResult = my.BeginInvoke(3,300, MethodCompleted, my);

Console.WriteLine(“职责早先”);

Console.Read();

}

}

五、别的零件的BeginXXX和EndXXX方法

在此外的.net组件中也有像样BeginInvoke和EndInvoke的诀要,如System.Net.HttpWebRequest类的BeginGetResponse和EndGetResponse方法。其选择方法类似于委托项目标BeginInvoke和EndInvoke方法,例如:

复制代码 代码如下:

class Program

{

//回调函数

private static void requestCompleted(IAsyncResult asyncResult)

{

if (asyncResult == null || asyncResult.AsyncState==null)

{

Console.WriteLine(“回调失利”);

return;

}

HttpWebRequest hwr = asyncResult.AsyncState as HttpWebRequest;

HttpWebResponse response =
(HttpWebResponse)hwr.EndGetResponse(asyncResult);

StreamReader sr = new StreamReader(response.GetResponseStream());

string str = sr.ReadToEnd();

Console.WriteLine(“重返流长度:”+str.Length);

}

static void Main(string[] args)

{

HttpWebRequest request =

(HttpWebRequest)WebRequest.Create(“http://www.baidu.com“);

//异步请求

IAsyncResult asyncResult = request.BeginGetResponse(requestCompleted,
request);

Console.WriteLine(“职责起初”);

Console.Read();

}

}

相关文章