using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;namespace ThreadDemo
{
public class ThreadProxy : IDisposable
{
private int _threadCount = 1;
ExpressCollection _list;
private Thread[] _threads = null;
private bool _isRun = false;
private bool _hasDataToHandle; public ThreadProxy(ExpressCollection list)
{
_list = list;
} public bool HasDataToHandle
{
get
{
return _hasDataToHandle;
}
set
{
if (value)//如果设置为true时就监测当前线程是否挂起
{
if (this != null)//这里怎样才能获得当前线程数组的引用呢?this不行呢?
{
if (.ThreadState == System.Threading.ThreadState.Suspended)
//如果当前线程已经挂起,就启动当前线程
{
Thread.Resume();
}
}
} _hasDataToHandle = value;
}
}
public ThreadProxy(int threadCount, ExpressCollection list)
: this(list)
{
_threadCount = threadCount;
_threads = new Thread[_threadCount];
} public void Run(bool Re)
{
if (Re) _isRun = false; if (!_isRun && _list != null && _list.Count>0)
{
_isRun = true;
for (int i = 0; i < _threadCount; i++)
{
_threads[i] = new Thread(new ThreadStart(ThreadInvoke));
_threads[i].IsBackground = true;
_threads[i].Start();
}
}
} public void Stop()
{
_isRun = false;
} private void ThreadInvoke()
{
try
{
while (_isRun)
{
Express express = _list.GetNext();
if (express != null)
{
int result = express.A + express.B;
OnExpressComputed(result, express);
Thread.Sleep(100);//测试暂停
_hasDataToHandle = false;
if (!_hasDataToHandle)//这个在while循环的最下层
{
sThread.Suspend(); //如果当前没有任务做就挂起当前线程
}
}
else
{
break;
}
//else
//{
// Thread.Sleep(1000);
//}
}
}
catch (ThreadAbortException)
{
Thread.ResetAbort();
return;
}
catch (Exception)
{
//记录日志
}
} public event EventHandler<ExpressComputedEventArgs> ExpressComputed; protected virtual void OnExpressComputed(int result ,Express express)
{
if (ExpressComputed != null)
{
ExpressComputed(this, new ExpressComputedEventArgs(result,express));
}
} #region IDisposable 成员 public void Dispose()
{
_isRun = false;
if (_threads != null)
{
_threads = null;
}
} #endregion
} public class ExpressComputedEventArgs : EventArgs
{
private int result; public int Result
{
get { return result; }
set { result = value; }
} public ExpressComputedEventArgs(int result , Express express)
{
this.result = result;
this.express = express;
} private Express express; public Express Express
{
get { return express; }
set { express = value; }
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Threading;namespace ThreadDemo
{
public class ThreadProxy : IDisposable
{
private int _threadCount = 1;
ExpressCollection _list;
private Thread[] _threads = null;
private bool _isRun = false;
private bool _hasDataToHandle; public ThreadProxy(ExpressCollection list)
{
_list = list;
} public bool HasDataToHandle
{
get
{
return _hasDataToHandle;
}
set
{
if (value)//如果设置为true时就监测当前线程是否挂起
{
if (this != null)//这里怎样才能获得当前线程数组的引用呢?this不行呢?
{
if (.ThreadState == System.Threading.ThreadState.Suspended)
//如果当前线程已经挂起,就启动当前线程
{
Thread.Resume();
}
}
} _hasDataToHandle = value;
}
}
public ThreadProxy(int threadCount, ExpressCollection list)
: this(list)
{
_threadCount = threadCount;
_threads = new Thread[_threadCount];
} public void Run(bool Re)
{
if (Re) _isRun = false; if (!_isRun && _list != null && _list.Count>0)
{
_isRun = true;
for (int i = 0; i < _threadCount; i++)
{
_threads[i] = new Thread(new ThreadStart(ThreadInvoke));
_threads[i].IsBackground = true;
_threads[i].Start();
}
}
} public void Stop()
{
_isRun = false;
} private void ThreadInvoke()
{
try
{
while (_isRun)
{
Express express = _list.GetNext();
if (express != null)
{
int result = express.A + express.B;
OnExpressComputed(result, express);
Thread.Sleep(100);//测试暂停
_hasDataToHandle = false;
if (!_hasDataToHandle)//这个在while循环的最下层
{
sThread.Suspend(); //如果当前没有任务做就挂起当前线程
}
}
else
{
break;
}
//else
//{
// Thread.Sleep(1000);
//}
}
}
catch (ThreadAbortException)
{
Thread.ResetAbort();
return;
}
catch (Exception)
{
//记录日志
}
} public event EventHandler<ExpressComputedEventArgs> ExpressComputed; protected virtual void OnExpressComputed(int result ,Express express)
{
if (ExpressComputed != null)
{
ExpressComputed(this, new ExpressComputedEventArgs(result,express));
}
} #region IDisposable 成员 public void Dispose()
{
_isRun = false;
if (_threads != null)
{
_threads = null;
}
} #endregion
} public class ExpressComputedEventArgs : EventArgs
{
private int result; public int Result
{
get { return result; }
set { result = value; }
} public ExpressComputedEventArgs(int result , Express express)
{
this.result = result;
this.express = express;
} private Express express; public Express Express
{
get { return express; }
set { express = value; }
}
}
}
解决方案 »
- 时间段在dateTimePicker1和dateTimePicker2之间的SQL语句怎么写?
- resx属性在修改设计后被覆盖的问题
- 第三次发帖了,还没解决的问题
- 有没有什么控件其上的文字可以选中的?
- 怎么显示不出来?
- 2005中dataGridView的问题!sos sos
- 请教思归等大侠:关于Remtoing组件的调试问题,很急!
- 竟然出错了!再求一次。100分求助--如何得到axWebbrowser中用户所选择的文字?
- 怎样将8bit的bitmap存储成8bit的jpeg格式?
- 我的简单问题
- 100分高手快来啊~~~~~~~~大文件打包问题~
- C# 开发自定义服务 怎么不使用默认系统帐号,能够自己输入帐号和密码.
static extern int GetCurrentThreadId();