首页 新闻 搜索 专区 学院

关于异步编程的问题请教

0
悬赏园豆:50 [已解决问题] 解决于 2008-09-04 18:16

在学习异步编程时,想到一个问题,假如我使用BeginInvoke调用了一个方法,这个方法很耗时,或者是线程池满员,它一直在队列中待着了,我等不了它的结果了。有这样的方法吗,设置个时间,比如超过1分钟我就不再等了。

还有一个问题是被异步调用了,方法在线程池里肯定会执行是吧,除非这个线程出了点什么事,当像出现我前面的那种超时不想等了的情况,可能过几分钟轮到它了,还是会执行,没法取消。

lexus的主页 lexus | 初学一级 | 园豆:0
提问于:2008-09-02 13:10
< >
分享
最佳答案
0
目前还没有任何方式可以取消一个未完成的异步操作。因为它实现起来非常困难。 当然,你也可以实现一个 IAsyncResult 接口的对象,并提供取消方法。这种情况下,可以取消操作。但请谨慎仔细的实现它,保证取消操作不会引发问题。 非常耗时的操作应当使用单独的线程来完成,这样不但比异步方式更加灵活,而且更加高效,实现取消操作也比异步容易的多。 假如使用异步编程,线程池满员后,仍然有异步操作,这时会发生死锁。 一旦异步调用,即 BeginXXX() 方法,方法并不一定在线程池里执行。大概有以下几种执行情况: 1.线程池中的线程。 2.内核线程,或者说驱动层线程。 3.Windows 窗口异步消息。 4.跨网络通信。 诸如此类,也是异步操作取消实现困难的原因所在。
Angel Lucifer | 小虾三级 |园豆:775 | 2008-09-02 15:51
其他回答(1)
0
我们来分析一下 按照你的思路 首先 我们不用异步线程是吧,我们只能用单一线程咯,这样的话 单线程就是一条单人行道 假设我们有楼主这样的方法 一 我们要有一个侦测器 检测 服务开启的动作 二 服务 执行 开启的动作 这样的话 和单线程 只能执行一个动作 矛盾 我认为 这个方法是没有的 服务的开启中 经常 碰到楼主 面临的问题 在服务设计中 ,开启的过程是直接赋予异步线程中的 我的理解 服务的开启触发 仅仅是通知某个服务 开始服务啦 具体 准备服务的时间 有多 对于服务管理器是不需要关注的
狗尾草1 | 园豆:202 (菜鸟二级) | 2008-09-02 15:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册