在上一节中,我们讲解了线程池的基本应用。

但是,我们如何给每个线程提供参数呢 ?因为每个线程执行所要执行的任务中,需要处理的参数也许不同。

让我们来了解一下ThreadPool.QueueUserWorkItem方法。

首先,看两个方法的签名:

1.public static bool QueueUserWorkItem(WaitCallback callBack)方法

//
// 摘要:
// 将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。
//
// 参数:
// callBack:
// 一个 System.Threading.WaitCallback,表示要执行的方法。
//
// 返回结果:
// 如果此方法成功排队,则为 true;如果未能将该工作项排队,则引发 System.NotSupportedException。
//
// 异常:
// System.ArgumentNullException:
// callBack 为 null。
//
// System.NotSupportedException:
// 承载公共语言运行时 (CLR) 的宿主不支持此操作。
[SecuritySafeCritical]
public static bool QueueUserWorkItem(WaitCallback callBack);

2.public static bool QueueUserWorkItem(WaitCallback callBack, object state)方法。

//
// 摘要:
// 将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
//
// 参数:
// callBack:
// System.Threading.WaitCallback,它表示要执行的方法。
//
// state:
// 包含方法所用数据的对象。
//
// 返回结果:
// 如果此方法成功排队,则为 true;如果未能将该工作项排队,则引发 System.NotSupportedException。
//
// 异常:
// System.NotSupportedException:
// 承载公共语言运行时 (CLR) 的宿主不支持此操作。
//
// System.ArgumentNullException:
// callBack 为 null。
[SecuritySafeCritical]
public static bool QueueUserWorkItem(WaitCallback callBack, object state);

对,我们就是要用 object state,来传递给每个线程池中线程的参数。

直接贴例子:

1.程序入口:

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace ThreadTest
{
class Program
{
static void Main(string[] args)
{
int nWorkerThreads;
int nCompletionProtThreads;
ThreadPool.GetMaxThreads(out nWorkerThreads, out nCompletionProtThreads);
Console.WriteLine(" 线程池中辅助线程的最大数目:{0};线程池中异步 I/O 线程的最大数目:{1} ", nWorkerThreads, nCompletionProtThreads);
Console.ReadLine();
List<Students> list = new List<Students>();
for (int i = 0; i < 100; i++)
{
Students temp = new Students(i, "Tom" + i.ToString());
list.Add(temp);
}
foreach (Students s in list)
{
ThreadPool.QueueUserWorkItem(JobForThread,s);// 将方法排入队列以便执行。此方法在有线程池线程变得可用时执行
}

Thread.Sleep(3000);
Console.ReadLine();

}

/// <summary>
/// 线程池中,每个线程要执行的操作
/// </summary>
/// <param name="state"></param>
static void JobForThread(object state)
{
Students curStu= state as Students;
Console.WriteLine(" 执行当前处理的托管线程的唯一标识符: {0} -- 学生ID:{1} -- 学生姓名:{2}", Thread.CurrentThread.ManagedThreadId, curStu.SId, curStu.SName);
}

}
}

2.传递的参数类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ThreadTest
{
/// <summary>
/// 学生类
/// </summary>
public class Students
{
private int _sId;
private string _sName;

public int SId
{
get { return _sId; }
set { _sId = value; }
}

public string SName
{
get { return _sName; }
set { _sName = value; }
}

public Students(int sId, string sName)
{
this._sId = sId;
this._sName = sName;

}

public void ShowInfo()
{
Console.WriteLine(_sId);
Console.WriteLine(_sName);
}

}
}


运行结果:

 

讲解:

1.通过,ThreadPool.QueueUserWorkItem(JobForThread,s);将参数传递给每个线程池中的线程。这样,就可以为每个不同的线程传递参数。

希望对您有所帮助,谢谢!




 




posted on 2012-01-16 11:36  金丝猴  阅读(509)  评论(0编辑  收藏  举报