也不供给再次回到参数,创制3个新的线程格式


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

由此信托的措施创设线程

本文章重要介绍了c#采纳多线程的两种方法,通过示范学习c#的二十十二线程使用方法,我们参考运用啊


(1)不要求传递参数,也不需求重临参数

 

ThreadStart是三个信托,那个委托的概念为void
ThreadStart(),没有参数与重回值。

static int sum(int x)

复制代码 代码如下:

{

class Program

return x+x;

{

{

static void Main(string[] args)

Func<int> a = sum;

{

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

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

赢得3个线程的重临值: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)

}

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

public static void Calculate()

    static void OnCallback(IAsyncResult ar)

{

    {

DateTime time = DateTime.Now;//得到当前光阴

      第③个null参数是回调函数传递的数目,例如:

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

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

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

    }

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)

 

{

也足以团结写2个类,例如:

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*10+10);//传递参数

  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(“下载完结”);

}

  }

}

}

(3)使用专门的线程类(常用)

在program中调用

使用线程类可以有几个参数与四个重回值,十二分心灵手巧!

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

复制代码 代码如下:

Thread t = new Thread(myt.Down);

class Program

t.Start();

{

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

static void Main(string[] args)

线程分为前台线程与后台线程,后台线程会伴随着前台线程的终止而被威吓甘休

{

强制截止三个线程: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#中一度封装好了贰个线程池ThreadPool,在双核的规则下暗中认可10贰十三个干活线程,和一千个I/O线程。全部线程为后台线程

   //等待线程甘休

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

while (thread.ThreadState != ThreadState.Stopped)

 像2个正在运营的线程加锁的用法: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(10, 100));//随机休眠一段时间

Console.WriteLine(this.Parame);

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

}

}

(4)使用匿超情势(常用)

行使匿名格局运转线程能够有多少个参数和再次来到值,而且使用尤其方便!

复制代码 代码如下:

class Program

{

static void Main(string[] args)

{

int Parame = 100;//当做参数

int Result = 0;//当做再次回到值

//匿名方法

ThreadStart threadStart = new ThreadStart(delegate()

{

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

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

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

Result = Parame * ra.Next(10, 100);//计算重回值

});

Thread thread = new Thread(threadStart);

thread.Start();//二十多线程运营匿名情势

//等待线程停止

while (thread.ThreadState != ThreadState.Stopped)

{

Thread.Sleep(10);

}

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

Console.Read();

}
}

(5)使用委托开启二十四线程(多线程深切)

壹 、用委托(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方法将被卡住2秒

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,表示不等待,假诺为-1,表示永远等待,直到异步调用完结。

复制代码 代码如下:

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();

}

}

4、使用回调格局赶回结果

要留意的是“my.BeginInvoke(3,300, MethodCompleted,
my)”,BeginInvoke方法的参数传递格局:

眼下一部分(3,300)是其委托小编的参数。

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

末段叁个参数(my)供给向MethodCompleted方法中传送一些值,一般能够传递被调用方法的委托,那个值能够运用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();

}

}

相关文章