例子上网上找的,怎么样使用这样的自定义线程pool收发消息socket
代码如下:
ThreadManager.cs
public class ThreadManager
{
private static ArrayList threadList = new ArrayList();//线程列表,静态 //不允许创建实例
private ThreadManager()
{ } /// <summary>
/// 静态方法,开启或唤醒一个线程去执行指定的回调方法
/// </summary>
/// <param name="waitCallback">委托实例</param>
/// <param name="obj">传递给回调方法的参数</param>
/// <param name="timeOut">当没有可用的线程时的等待时间,以毫秒为单位</param>
/// <returns></returns> public static bool QueueUserWorkItem(WaitCallback waitCallback, Object obj, int timeOut)
{
//锁住共享资源,实现线程安全
lock(threadList)
{
try
{
//如果线程列表为空,填充线程列表
if (threadList.Count == 0)
{
InitThreadList();
}
long startTime = DateTime.Now.Ticks;
do
{
//遍历线程列表,找出可用的线程
foreach(MyThread myThread in threadList)
{
//线程为空,需要创建线程
if (myThread.T == null)
{
myThread.Start(waitCallback, obj, false);
return true;
}
else if (myThread.T.ThreadState == ThreadState.Suspended)
{//线程为挂起状态,唤醒线程
myThread.Start(waitCallback, obj, true);
return true;
}
}
//在线程 Sleep 前释放锁
Monitor.PulseAll(threadList);
Thread.Sleep(500);
}while (((DateTime.Now.Ticks - startTime) / 10000) < timeOut);
}
finally
{
Monitor.Exit(threadList);
}
}
return false;
}
//使用MyThread 对象填充线程列表,注意,这个时候线程并没有启动
private static void InitThreadList()
{
threadList = new ArrayList();
for (int i = 0; i < 10; i++)
{
MyThread t = new MyThread();
threadList.Add(t);
}
}
}
MyThread.cs
internal class MyThread
{
private Thread t;//线程
private WaitCallback w; //委托,这里直接用.NET框架自带的,也可以根据许自己定义一个
private object o;//传递给符合委托的回调方法的参数值,根据委托的定义而定
/// <summary>
/// 执行回调方法的线程
/// </summary>
public Thread T
{
get
{
return t;
}
}
public MyThread()
{
}
/// <summary>
///开启新线程或唤醒线程,去执行回调方法
/// </summary>
/// <param name="w">用回调方法实例化了的委托实例</param>
/// <param name="o">传递给回调方法的参数值</param>
/// <param name="isSuspend">true 表示线程为挂起状态,false</param>
public void Start(WaitCallback w, Object o, bool isSuspend)
{
//开启新线程或唤醒线程前,先设置
this.w = w;
this.o = o;
//线程为挂起状态,唤醒线程继续执行
if (isSuspend)
{
t.Resume(); }
else
{
//线程还可以创建,创建一个新线程,并执行
t = new Thread(new ThreadStart(this.ThreadProc));
t.Start();
}
}
private void ThreadProc()
{
//死循环,使线程唤醒后不是退出,而是继续通过委托执行回调方法
while (true)
{
//通过委托执行回调方法
w(o);
t.Suspend();
}
} }如何收发socket消息,测试的这个程序应该怎么写
代码如下:
ThreadManager.cs
public class ThreadManager
{
private static ArrayList threadList = new ArrayList();//线程列表,静态 //不允许创建实例
private ThreadManager()
{ } /// <summary>
/// 静态方法,开启或唤醒一个线程去执行指定的回调方法
/// </summary>
/// <param name="waitCallback">委托实例</param>
/// <param name="obj">传递给回调方法的参数</param>
/// <param name="timeOut">当没有可用的线程时的等待时间,以毫秒为单位</param>
/// <returns></returns> public static bool QueueUserWorkItem(WaitCallback waitCallback, Object obj, int timeOut)
{
//锁住共享资源,实现线程安全
lock(threadList)
{
try
{
//如果线程列表为空,填充线程列表
if (threadList.Count == 0)
{
InitThreadList();
}
long startTime = DateTime.Now.Ticks;
do
{
//遍历线程列表,找出可用的线程
foreach(MyThread myThread in threadList)
{
//线程为空,需要创建线程
if (myThread.T == null)
{
myThread.Start(waitCallback, obj, false);
return true;
}
else if (myThread.T.ThreadState == ThreadState.Suspended)
{//线程为挂起状态,唤醒线程
myThread.Start(waitCallback, obj, true);
return true;
}
}
//在线程 Sleep 前释放锁
Monitor.PulseAll(threadList);
Thread.Sleep(500);
}while (((DateTime.Now.Ticks - startTime) / 10000) < timeOut);
}
finally
{
Monitor.Exit(threadList);
}
}
return false;
}
//使用MyThread 对象填充线程列表,注意,这个时候线程并没有启动
private static void InitThreadList()
{
threadList = new ArrayList();
for (int i = 0; i < 10; i++)
{
MyThread t = new MyThread();
threadList.Add(t);
}
}
}
MyThread.cs
internal class MyThread
{
private Thread t;//线程
private WaitCallback w; //委托,这里直接用.NET框架自带的,也可以根据许自己定义一个
private object o;//传递给符合委托的回调方法的参数值,根据委托的定义而定
/// <summary>
/// 执行回调方法的线程
/// </summary>
public Thread T
{
get
{
return t;
}
}
public MyThread()
{
}
/// <summary>
///开启新线程或唤醒线程,去执行回调方法
/// </summary>
/// <param name="w">用回调方法实例化了的委托实例</param>
/// <param name="o">传递给回调方法的参数值</param>
/// <param name="isSuspend">true 表示线程为挂起状态,false</param>
public void Start(WaitCallback w, Object o, bool isSuspend)
{
//开启新线程或唤醒线程前,先设置
this.w = w;
this.o = o;
//线程为挂起状态,唤醒线程继续执行
if (isSuspend)
{
t.Resume(); }
else
{
//线程还可以创建,创建一个新线程,并执行
t = new Thread(new ThreadStart(this.ThreadProc));
t.Start();
}
}
private void ThreadProc()
{
//死循环,使线程唤醒后不是退出,而是继续通过委托执行回调方法
while (true)
{
//通过委托执行回调方法
w(o);
t.Suspend();
}
} }如何收发socket消息,测试的这个程序应该怎么写
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货