怎么让程序等待一段时间赋值,不能用 sleep

时间:2020-12-12 15:25:42
因为程序需要调搜狗地图的api返回一个在值,但是需要等3秒钟才能得到这个值。不能用sleep,因为它会彻底把程序停止,停止结束后依然需要等待3秒钟。
我用timer控件实现了这个功能,但是我需要把它做成一个类,请各位大神指教

18 个解决方案

#1


能把问题描述清楚么?一般来说你这个其实和sleep,timer,等xxx秒什么的没关系,只是你用了不合适(错误)的解决方法而已。

比如,我很难理解"因为程序需要调搜狗地图的api返回一个在值,但是需要等3秒钟才能得到这个值"这句话的意思。
就好像是在说:

var data = api.Func();

Console.WriteLine(data);


你这里的data,直接运行的话,就是个null,必须要在Console.WriteLine之前磨蹭3秒钟才能有值?
显然有问题啊

#2


3秒钟的时间,为什么是3秒?  调用API到返回结果需要3秒? 

#3


你不会用异步么??干嘛要在主线程sleep

#4


说一种简单方法:
开个线程去搜狗的api取值,
工作线程和主线程可以采用ManualResetEvent来处理,
主线程 manualEvent.WaitOne();
工作线程完成后manualEvent.set()

#5


用多线程,sleep它就不会把整个程序停了

#6


干嘛要sleep,最差也要弹个什么加载的窗体出来,告诉用户正在取数据嘛。

#7


异步回调啊,这个想都不用想。

#8


引用 7 楼 SQL_Beginner 的回复:
异步回调啊,这个想都不用想。


因为他满脑子就是“等、等、等”这种思路。他就从来没有“网络驱动层会自动回调或者抛出事件通知”这种任务驱动设计概念。

#9


引用 8 楼 sp1234 的回复:
Quote: 引用 7 楼 SQL_Beginner 的回复:

异步回调啊,这个想都不用想。


因为他满脑子就是“等、等、等”这种思路。他就从来没有“网络驱动层会自动回调或者抛出事件通知”这种任务驱动设计概念。


是的,他们不懂事件和委托,觉得那东西没用。同时遇到回调才能解决的问题又无法解决。

#10


引用 楼主 cmy_ymc 的回复:
因为程序需要调搜狗地图的api返回一个在值,但是需要等3秒钟才能得到这个值。不能用sleep,因为它会彻底把程序停止,停止结束后依然需要等待3秒钟。
我用timer控件实现了这个功能,但是我需要把它做成一个类,请各位大神指教


很可惜。你稍微深入一点点就会想到,一定有些东西是可以及时通知你“什么时候刚好返回了结果”的。如果你懒得去自己寻找答案,那么软件设计对于你来说就是一个“坑”。不是它坑你,就是你坑自己。

#11


开一个线程,异步执行。

#12


你可以用个while循环啊 在while中判断等时间间隔TimeSpan大于3秒的时候跳出啊

#13


异步执行,不要等,不要sleep,万一网络不好3秒没回来呢.

#14


引用 8 楼 sp1234 的回复:
Quote: 引用 7 楼 SQL_Beginner 的回复:

异步回调啊,这个想都不用想。


因为他满脑子就是“等、等、等”这种思路。他就从来没有“网络驱动层会自动回调或者抛出事件通知”这种任务驱动设计概念。

有点难受,但真心接受批评。

#15


信号量。启用一个读线程,读完立马返回,启用另一个接收信号线程,内部等待,设置超时3秒,
mutex.waitone(3000) 。。。。

#16


显然是异步方法+回调函数

#17


stream类的 BeginRead 和 BeginWrite 方法就是异步读写,楼主查下具体用法吧

#18


该回复于2013-08-21 22:47:53被版主删除

#1


能把问题描述清楚么?一般来说你这个其实和sleep,timer,等xxx秒什么的没关系,只是你用了不合适(错误)的解决方法而已。

比如,我很难理解"因为程序需要调搜狗地图的api返回一个在值,但是需要等3秒钟才能得到这个值"这句话的意思。
就好像是在说:

var data = api.Func();

Console.WriteLine(data);


你这里的data,直接运行的话,就是个null,必须要在Console.WriteLine之前磨蹭3秒钟才能有值?
显然有问题啊

#2


3秒钟的时间,为什么是3秒?  调用API到返回结果需要3秒? 

#3


你不会用异步么??干嘛要在主线程sleep

#4


说一种简单方法:
开个线程去搜狗的api取值,
工作线程和主线程可以采用ManualResetEvent来处理,
主线程 manualEvent.WaitOne();
工作线程完成后manualEvent.set()

#5


用多线程,sleep它就不会把整个程序停了

#6


干嘛要sleep,最差也要弹个什么加载的窗体出来,告诉用户正在取数据嘛。

#7


异步回调啊,这个想都不用想。

#8


引用 7 楼 SQL_Beginner 的回复:
异步回调啊,这个想都不用想。


因为他满脑子就是“等、等、等”这种思路。他就从来没有“网络驱动层会自动回调或者抛出事件通知”这种任务驱动设计概念。

#9


引用 8 楼 sp1234 的回复:
Quote: 引用 7 楼 SQL_Beginner 的回复:

异步回调啊,这个想都不用想。


因为他满脑子就是“等、等、等”这种思路。他就从来没有“网络驱动层会自动回调或者抛出事件通知”这种任务驱动设计概念。


是的,他们不懂事件和委托,觉得那东西没用。同时遇到回调才能解决的问题又无法解决。

#10


引用 楼主 cmy_ymc 的回复:
因为程序需要调搜狗地图的api返回一个在值,但是需要等3秒钟才能得到这个值。不能用sleep,因为它会彻底把程序停止,停止结束后依然需要等待3秒钟。
我用timer控件实现了这个功能,但是我需要把它做成一个类,请各位大神指教


很可惜。你稍微深入一点点就会想到,一定有些东西是可以及时通知你“什么时候刚好返回了结果”的。如果你懒得去自己寻找答案,那么软件设计对于你来说就是一个“坑”。不是它坑你,就是你坑自己。

#11


开一个线程,异步执行。

#12


你可以用个while循环啊 在while中判断等时间间隔TimeSpan大于3秒的时候跳出啊

#13


异步执行,不要等,不要sleep,万一网络不好3秒没回来呢.

#14


引用 8 楼 sp1234 的回复:
Quote: 引用 7 楼 SQL_Beginner 的回复:

异步回调啊,这个想都不用想。


因为他满脑子就是“等、等、等”这种思路。他就从来没有“网络驱动层会自动回调或者抛出事件通知”这种任务驱动设计概念。

有点难受,但真心接受批评。

#15


信号量。启用一个读线程,读完立马返回,启用另一个接收信号线程,内部等待,设置超时3秒,
mutex.waitone(3000) 。。。。

#16


显然是异步方法+回调函数

#17


stream类的 BeginRead 和 BeginWrite 方法就是异步读写,楼主查下具体用法吧

#18


该回复于2013-08-21 22:47:53被版主删除