用什么来代替Suspend和Resume,该如何解决
用什么来代替Suspend和Resume
Suspend和Resume 在VS2008中调用会提示 已经过时,现在公司要求编译时不允许出现警告,而以前的代码组织比较有问题,请见下面代码:
public void PauseThread(int ThreadNum)
{
for (int i = 0; i < ThreadNum; i++)
{
if (mThreadPool[i].ThreadState != ThreadState.Stopped)
{
mThreadPool[i].Suspend();
}
}
mIsAllThreadPause = true;
}
public void ContinueThread(int ThreadNum)
{
for (int i = 0; i < mThreadPool.Length; i++)
{
if (mThreadPool[i] != null && mThreadPool[i].ThreadState != ThreadState.Stopped)
{
mThreadPool[i].Resume();
}
}
}
public void RunThread(TabPage GenPage, GroupBox CtrlBox, TextBox ScenarioBox, TextBox LogBox, LogWriter pLog)
{
for (int i = 0; i < NumofThread; i++)
{
......
mThreadPool[i] = new Thread(new ParameterizedThreadStart(ThreadPro));
bool TimeFlag = false;
do
{
TimeFlag = true;
if (Time <= DateTime.Now.Ticks)
{
TimeFlag = false;
}
} while (TimeFlag);
mThreadPool[i].IsBackground = true;
mThreadPool[i].Start(pParam);
}
}
有什么办法可以让以上代码编译时没警告? 本人调查下来可以用类似Mutex 的WaitOne方法,不过这样的话在TREADSTART方法里比较适合用循环的方法去实现,不过我的TREADSTART方法中没有循环
------解决方案--------------------
给搂主写了一个演示代码,搂主可以体验一下使用控制变量控制线程的方式:
Suspend和Resume 在VS2008中调用会提示 已经过时,现在公司要求编译时不允许出现警告,而以前的代码组织比较有问题,请见下面代码:
public void PauseThread(int ThreadNum)
{
for (int i = 0; i < ThreadNum; i++)
{
if (mThreadPool[i].ThreadState != ThreadState.Stopped)
{
mThreadPool[i].Suspend();
}
}
mIsAllThreadPause = true;
}
public void ContinueThread(int ThreadNum)
{
for (int i = 0; i < mThreadPool.Length; i++)
{
if (mThreadPool[i] != null && mThreadPool[i].ThreadState != ThreadState.Stopped)
{
mThreadPool[i].Resume();
}
}
}
public void RunThread(TabPage GenPage, GroupBox CtrlBox, TextBox ScenarioBox, TextBox LogBox, LogWriter pLog)
{
for (int i = 0; i < NumofThread; i++)
{
......
mThreadPool[i] = new Thread(new ParameterizedThreadStart(ThreadPro));
bool TimeFlag = false;
do
{
TimeFlag = true;
if (Time <= DateTime.Now.Ticks)
{
TimeFlag = false;
}
} while (TimeFlag);
mThreadPool[i].IsBackground = true;
mThreadPool[i].Start(pParam);
}
}
有什么办法可以让以上代码编译时没警告? 本人调查下来可以用类似Mutex 的WaitOne方法,不过这样的话在TREADSTART方法里比较适合用循环的方法去实现,不过我的TREADSTART方法中没有循环
------解决方案--------------------
给搂主写了一个演示代码,搂主可以体验一下使用控制变量控制线程的方式:
- C# code
public partial class MainForm : Form { public MainForm() { this.InitializeComponent(); } private Thread m_thread = null; private ThreadState m_state = ThreadState.Unstarted; private void HandleTask() { this.m_state = ThreadState.Running; int i = 0; while (i < 100000) { //已经暂停 if(this.m_state == ThreadState.Suspended) continue; //请求暂停 if (this.m_state == ThreadState.SuspendRequested) { this.m_state = ThreadState.Suspended; continue; } //已经停止 if (this.m_state == ThreadState.Stopped) break; //请求停止 if (this.m_state == ThreadState.StopRequested) { this.m_state = ThreadState.Stopped; break; } //处理主要任务,这里休息100ms是为了模拟实际任务的执行时间 Thread.Sleep(100); i = i + 1; //在界面上显示信息 this.Invoke(new ShowInfoHandler(this.ShowInfo), new object[] { i }); } this.m_thread = null; this.m_state = ThreadState.Stopped; } public void Start() { if (this.m_thread == null) { this.m_thread = new Thread(new ThreadStart(this.HandleTask)); this.m_thread.Start(); } if (this.m_state == ThreadState.Suspended) this.m_state = ThreadState.Running; } public void Pause() { this.m_state = ThreadState.SuspendRequested; while (this.m_state != ThreadState.Suspended) Application.DoEvents(); } public void Stop() { this.m_state = ThreadState.StopRequested; while (this.m_state != ThreadState.Stopped) Application.DoEvents(); } private delegate void ShowInfoHandler(int value); private void ShowInfo(int value) { this.label1.Text = value.ToString(); } private void btnRun_Click(object sender, EventArgs e) { this.Start(); } private void btnPause_Click(object sender, EventArgs e) { this.Pause(); } private void btnStop_Click(object sender, EventArgs e) { this.Stop(); } }