C#线程暂停与继续

时间:2022-05-31 18:32:11
我有一个线程是向设备发送命令,当点击暂停的时候,就停止执行任务,然后再点击开始的时候继续执行线程里面的任务。点击停止的时候也是暂停线程任务的执行,点击开始的时候重新执行。
暂停的时候我该如何去停止线程,点击start的时候如何继续刚才暂停的任务?
停止的时候又该如何去停止线程的工作,以及按了start的时候如何开始?

11 个解决方案

#2


去我博客看下  我那里有个线程暂停、开始的方法(有短时间我也用用到了,然后百科总结的写了个方法)  看不懂的话  私信过来你QQ 我给你个winform的例子 C#线程暂停与继续

#3


引用 1 楼 bdmh 的回复:
参考 http://www.360doc.com/content/11/0217/11/3705007_93741317.shtml

顺便借这个帖子请教下版主,如果我的线程中的处理不是随时可以暂停的,比如其中有连续几个与下位机的通讯操作,不能执行了2个操作,线程暂停下来。这样的情况如何处理?
我现在的线程是定义在一个类中的,我目前是另外在类里面定义了一个状态变量,再定义了一个暂停函数,在外部代码调用这个类的暂停函数时,则改变类里面的那个状态变量为暂停,而我上面说的连续几个操作之间是检查这个状态变量的,只有在都执行完成后,才检查这个状态变量,然后再暂停。
不知道还有没有更好的方法来处理这样的情况。如果我上面说的不详细,还请指出。

#4


提供另外一种思路供参考。
不暂停或者回复线程,线程一直在运行,在线程中使用线程安全的变量作为开关。满足某种条件时,进行相关处理,不满足让线程sleep即可。在程序退出时再退出线程。

#5


线程开始:
            thread.Start();
线程挂起 
            thread.Suspend();
线程继续
            thread.Resume();
线程终止
           thread.Abort();

#6


引用 2 楼 lxp520llq 的回复:
去我博客看下  我那里有个线程暂停、开始的方法(有短时间我也用用到了,然后百科总结的写了个方法)  看不懂的话  私信过来你QQ 我给你个winform的例子 C#线程暂停与继续

我线程运行的时候有相应的进度条来显示进度如何,用的是progress.performstep的方法,但是感觉比自己预计的快,这个怎么修改呢?谢谢!

#7


引用 4 楼 xian_wwq 的回复:
提供另外一种思路供参考。
不暂停或者回复线程,线程一直在运行,在线程中使用线程安全的变量作为开关。满足某种条件时,进行相关处理,不满足让线程sleep即可。在程序退出时再退出线程。

如果休眠的话,那怎么知道要休眠多久呢?

#8


引用 2 楼 lxp520llq 的回复:
去我博客看下  我那里有个线程暂停、开始的方法(有短时间我也用用到了,然后百科总结的写了个方法)  看不懂的话  私信过来你QQ 我给你个winform的例子 C#线程暂停与继续

我的线程所做的工作是向设备发送命令,然后有一个进度条来显示目前的进度,一共向设备发送4次命令,一次放松完成之后要停下来一段时间,然后再发送另一条命令,进度条的显示包括发送命令的以及等待的时间,我发觉在autoresetevent.waitone时候,我等待的时间过去了之后,这里会继续再执行一条才会停止,这是为什么?
for(int i = 0;i<commlist.count;i++)
{
    autoEvent.waitone();
    timeRun();//这里是执行进度条的那个
    String[] commstr = commlist[i] as string[];
    runcommand(commstr,i);//这里是发送命令的方法
    thread.sleep(time * 1000);//这里是上一个发送完后需要等待一段时间
    
}
我发觉我在把timer停止了之后,这一段会执行一遍才停下来,这个是为什么?
另执进度条的那个地方我也用了个timer。

#9


引用 8 楼 yuanzhouting 的回复:
Quote: 引用 2 楼 lxp520llq 的回复:

去我博客看下  我那里有个线程暂停、开始的方法(有短时间我也用用到了,然后百科总结的写了个方法)  看不懂的话  私信过来你QQ 我给你个winform的例子 C#线程暂停与继续

我的线程所做的工作是向设备发送命令,然后有一个进度条来显示目前的进度,一共向设备发送4次命令,一次放松完成之后要停下来一段时间,然后再发送另一条命令,进度条的显示包括发送命令的以及等待的时间,我发觉在autoresetevent.waitone时候,我等待的时间过去了之后,这里会继续再执行一条才会停止,这是为什么?
for(int i = 0;i<commlist.count;i++)
{
    autoEvent.waitone();
    timeRun();//这里是执行进度条的那个
    String[] commstr = commlist[i] as string[];
    runcommand(commstr,i);//这里是发送命令的方法
    thread.sleep(time * 1000);//这里是上一个发送完后需要等待一段时间
    
}
我发觉我在把timer停止了之后,这一段会执行一遍才停下来,这个是为什么?
另执进度条的那个地方我也用了个timer。



可能是惯性吧  C#线程暂停与继续说实话这个问题我也不知道什么原因 因为当时对我程序没多大妨碍 所以就没深研究了~~~~

#10


引用 9 楼 lxp520llq 的回复:
Quote: 引用 8 楼 yuanzhouting 的回复:

Quote: 引用 2 楼 lxp520llq 的回复:

去我博客看下  我那里有个线程暂停、开始的方法(有短时间我也用用到了,然后百科总结的写了个方法)  看不懂的话  私信过来你QQ 我给你个winform的例子 C#线程暂停与继续

我的线程所做的工作是向设备发送命令,然后有一个进度条来显示目前的进度,一共向设备发送4次命令,一次放松完成之后要停下来一段时间,然后再发送另一条命令,进度条的显示包括发送命令的以及等待的时间,我发觉在autoresetevent.waitone时候,我等待的时间过去了之后,这里会继续再执行一条才会停止,这是为什么?
for(int i = 0;i<commlist.count;i++)
{
    autoEvent.waitone();
    timeRun();//这里是执行进度条的那个
    String[] commstr = commlist[i] as string[];
    runcommand(commstr,i);//这里是发送命令的方法
    thread.sleep(time * 1000);//这里是上一个发送完后需要等待一段时间
    
}
我发觉我在把timer停止了之后,这一段会执行一遍才停下来,这个是为什么?
另执进度条的那个地方我也用了个timer。



可能是惯性吧  C#线程暂停与继续说实话这个问题我也不知道什么原因 因为当时对我程序没多大妨碍 所以就没深研究了~~~~

C#线程暂停与继续o(︶︿︶)o 唉,我后来改用了thread.suspend和thread.resume了

#11


引用 10 楼 yuanzhouting 的回复:
Quote: 引用 9 楼 lxp520llq 的回复:

Quote: 引用 8 楼 yuanzhouting 的回复:

Quote: 引用 2 楼 lxp520llq 的回复:

去我博客看下  我那里有个线程暂停、开始的方法(有短时间我也用用到了,然后百科总结的写了个方法)  看不懂的话  私信过来你QQ 我给你个winform的例子 C#线程暂停与继续

我的线程所做的工作是向设备发送命令,然后有一个进度条来显示目前的进度,一共向设备发送4次命令,一次放松完成之后要停下来一段时间,然后再发送另一条命令,进度条的显示包括发送命令的以及等待的时间,我发觉在autoresetevent.waitone时候,我等待的时间过去了之后,这里会继续再执行一条才会停止,这是为什么?
for(int i = 0;i<commlist.count;i++)
{
    autoEvent.waitone();
    timeRun();//这里是执行进度条的那个
    String[] commstr = commlist[i] as string[];
    runcommand(commstr,i);//这里是发送命令的方法
    thread.sleep(time * 1000);//这里是上一个发送完后需要等待一段时间
    
}
我发觉我在把timer停止了之后,这一段会执行一遍才停下来,这个是为什么?
另执进度条的那个地方我也用了个timer。



可能是惯性吧  C#线程暂停与继续说实话这个问题我也不知道什么原因 因为当时对我程序没多大妨碍 所以就没深研究了~~~~

C#线程暂停与继续o(︶︿︶)o 唉,我后来改用了thread.suspend和thread.resume了



只要能实现想要的功能用什么方法无所谓 C#线程暂停与继续

#1


#2


去我博客看下  我那里有个线程暂停、开始的方法(有短时间我也用用到了,然后百科总结的写了个方法)  看不懂的话  私信过来你QQ 我给你个winform的例子 C#线程暂停与继续

#3


引用 1 楼 bdmh 的回复:
参考 http://www.360doc.com/content/11/0217/11/3705007_93741317.shtml

顺便借这个帖子请教下版主,如果我的线程中的处理不是随时可以暂停的,比如其中有连续几个与下位机的通讯操作,不能执行了2个操作,线程暂停下来。这样的情况如何处理?
我现在的线程是定义在一个类中的,我目前是另外在类里面定义了一个状态变量,再定义了一个暂停函数,在外部代码调用这个类的暂停函数时,则改变类里面的那个状态变量为暂停,而我上面说的连续几个操作之间是检查这个状态变量的,只有在都执行完成后,才检查这个状态变量,然后再暂停。
不知道还有没有更好的方法来处理这样的情况。如果我上面说的不详细,还请指出。

#4


提供另外一种思路供参考。
不暂停或者回复线程,线程一直在运行,在线程中使用线程安全的变量作为开关。满足某种条件时,进行相关处理,不满足让线程sleep即可。在程序退出时再退出线程。

#5


线程开始:
            thread.Start();
线程挂起 
            thread.Suspend();
线程继续
            thread.Resume();
线程终止
           thread.Abort();

#6


引用 2 楼 lxp520llq 的回复:
去我博客看下  我那里有个线程暂停、开始的方法(有短时间我也用用到了,然后百科总结的写了个方法)  看不懂的话  私信过来你QQ 我给你个winform的例子 C#线程暂停与继续

我线程运行的时候有相应的进度条来显示进度如何,用的是progress.performstep的方法,但是感觉比自己预计的快,这个怎么修改呢?谢谢!

#7


引用 4 楼 xian_wwq 的回复:
提供另外一种思路供参考。
不暂停或者回复线程,线程一直在运行,在线程中使用线程安全的变量作为开关。满足某种条件时,进行相关处理,不满足让线程sleep即可。在程序退出时再退出线程。

如果休眠的话,那怎么知道要休眠多久呢?

#8


引用 2 楼 lxp520llq 的回复:
去我博客看下  我那里有个线程暂停、开始的方法(有短时间我也用用到了,然后百科总结的写了个方法)  看不懂的话  私信过来你QQ 我给你个winform的例子 C#线程暂停与继续

我的线程所做的工作是向设备发送命令,然后有一个进度条来显示目前的进度,一共向设备发送4次命令,一次放松完成之后要停下来一段时间,然后再发送另一条命令,进度条的显示包括发送命令的以及等待的时间,我发觉在autoresetevent.waitone时候,我等待的时间过去了之后,这里会继续再执行一条才会停止,这是为什么?
for(int i = 0;i<commlist.count;i++)
{
    autoEvent.waitone();
    timeRun();//这里是执行进度条的那个
    String[] commstr = commlist[i] as string[];
    runcommand(commstr,i);//这里是发送命令的方法
    thread.sleep(time * 1000);//这里是上一个发送完后需要等待一段时间
    
}
我发觉我在把timer停止了之后,这一段会执行一遍才停下来,这个是为什么?
另执进度条的那个地方我也用了个timer。

#9


引用 8 楼 yuanzhouting 的回复:
Quote: 引用 2 楼 lxp520llq 的回复:

去我博客看下  我那里有个线程暂停、开始的方法(有短时间我也用用到了,然后百科总结的写了个方法)  看不懂的话  私信过来你QQ 我给你个winform的例子 C#线程暂停与继续

我的线程所做的工作是向设备发送命令,然后有一个进度条来显示目前的进度,一共向设备发送4次命令,一次放松完成之后要停下来一段时间,然后再发送另一条命令,进度条的显示包括发送命令的以及等待的时间,我发觉在autoresetevent.waitone时候,我等待的时间过去了之后,这里会继续再执行一条才会停止,这是为什么?
for(int i = 0;i<commlist.count;i++)
{
    autoEvent.waitone();
    timeRun();//这里是执行进度条的那个
    String[] commstr = commlist[i] as string[];
    runcommand(commstr,i);//这里是发送命令的方法
    thread.sleep(time * 1000);//这里是上一个发送完后需要等待一段时间
    
}
我发觉我在把timer停止了之后,这一段会执行一遍才停下来,这个是为什么?
另执进度条的那个地方我也用了个timer。



可能是惯性吧  C#线程暂停与继续说实话这个问题我也不知道什么原因 因为当时对我程序没多大妨碍 所以就没深研究了~~~~

#10


引用 9 楼 lxp520llq 的回复:
Quote: 引用 8 楼 yuanzhouting 的回复:

Quote: 引用 2 楼 lxp520llq 的回复:

去我博客看下  我那里有个线程暂停、开始的方法(有短时间我也用用到了,然后百科总结的写了个方法)  看不懂的话  私信过来你QQ 我给你个winform的例子 C#线程暂停与继续

我的线程所做的工作是向设备发送命令,然后有一个进度条来显示目前的进度,一共向设备发送4次命令,一次放松完成之后要停下来一段时间,然后再发送另一条命令,进度条的显示包括发送命令的以及等待的时间,我发觉在autoresetevent.waitone时候,我等待的时间过去了之后,这里会继续再执行一条才会停止,这是为什么?
for(int i = 0;i<commlist.count;i++)
{
    autoEvent.waitone();
    timeRun();//这里是执行进度条的那个
    String[] commstr = commlist[i] as string[];
    runcommand(commstr,i);//这里是发送命令的方法
    thread.sleep(time * 1000);//这里是上一个发送完后需要等待一段时间
    
}
我发觉我在把timer停止了之后,这一段会执行一遍才停下来,这个是为什么?
另执进度条的那个地方我也用了个timer。



可能是惯性吧  C#线程暂停与继续说实话这个问题我也不知道什么原因 因为当时对我程序没多大妨碍 所以就没深研究了~~~~

C#线程暂停与继续o(︶︿︶)o 唉,我后来改用了thread.suspend和thread.resume了

#11


引用 10 楼 yuanzhouting 的回复:
Quote: 引用 9 楼 lxp520llq 的回复:

Quote: 引用 8 楼 yuanzhouting 的回复:

Quote: 引用 2 楼 lxp520llq 的回复:

去我博客看下  我那里有个线程暂停、开始的方法(有短时间我也用用到了,然后百科总结的写了个方法)  看不懂的话  私信过来你QQ 我给你个winform的例子 C#线程暂停与继续

我的线程所做的工作是向设备发送命令,然后有一个进度条来显示目前的进度,一共向设备发送4次命令,一次放松完成之后要停下来一段时间,然后再发送另一条命令,进度条的显示包括发送命令的以及等待的时间,我发觉在autoresetevent.waitone时候,我等待的时间过去了之后,这里会继续再执行一条才会停止,这是为什么?
for(int i = 0;i<commlist.count;i++)
{
    autoEvent.waitone();
    timeRun();//这里是执行进度条的那个
    String[] commstr = commlist[i] as string[];
    runcommand(commstr,i);//这里是发送命令的方法
    thread.sleep(time * 1000);//这里是上一个发送完后需要等待一段时间
    
}
我发觉我在把timer停止了之后,这一段会执行一遍才停下来,这个是为什么?
另执进度条的那个地方我也用了个timer。



可能是惯性吧  C#线程暂停与继续说实话这个问题我也不知道什么原因 因为当时对我程序没多大妨碍 所以就没深研究了~~~~

C#线程暂停与继续o(︶︿︶)o 唉,我后来改用了thread.suspend和thread.resume了



只要能实现想要的功能用什么方法无所谓 C#线程暂停与继续