请教一个困扰了我很久的异步问题

jy251 2009-07-01 05:49:30
目前我自己使用的异步实现方式有两种:
1.建立线程
2.使用回调,通过delegate的begininvoke

问题是:
这两种方式好像都是新建立一个线程来达到异步的,那么这两种方式有什么区别?
对于异步来说,上面哪种方式更好一点??好在什么地方呢?
就服务端程序的执行线程来说,肯定是使用线程好一些。

目前我就知道使用begininvoke可以很容易的获取异步的执行结果,线程差了点,但是同样也可以实现。那么他们的最大的区别在什么地方呢?

...全文
50 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jy251 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 evan_chan 的回复:]
个人理解:第一种的回收是主动的,也就是说需要你去监视那个线程,而第二种的回收应该是被动的
[/Quote]

正确

自己刚刚网上找了篇文章 http://space.itpub.net/12639172/viewspace-526512,为了mark,自己回复一下
jy251 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 windinwing 的回复:]
线程方法不可以传参,要用别的方式实现了
异步回调接实方法参数。
导步回调你可以查询是否调用完成,或者等待方法完成,线程不能或者很麻烦

我觉得最有用的就是合理安排调用时间,通知机制、

另外,在线程中处理控件的时候你也不得不用委托
很多类都提供了异步方法,如 数据流类,webservice类,优势是在线程中判断一个方法是否执行完成无什么用处
 返回值也不好处理了。
[/Quote]

同意你的一个观点:
合理安排调用时间,通知机制
但是你说的线程启动不能穿参数是有问题的,2003的确不能,但是2005之后,就可以带参的启动线程了。
yilvchaxiang 2009-07-01
  • 打赏
  • 举报
回复
学习中
Evan_Chan 2009-07-01
  • 打赏
  • 举报
回复
个人理解:第一种的回收是主动的,也就是说需要你去监视那个线程,而第二种的回收应该是被动的
LQknife 2009-07-01
  • 打赏
  • 举报
回复
自己建立的线程可以控制优先级啊 暂停 取消 什么时候开始啊这些
委托的begininvoke方法是建立在线程池的基础上的所以控制手段比较少一点
不过还是推荐用线程池的线程
龙宜坡 2009-07-01
  • 打赏
  • 举报
回复
根据《Microsoft .NET框架程序设计》的作者Jeffrey Richter 的看法,第二种方法使用委托的异步调用比较好

ltmltm123456 2009-07-01
  • 打赏
  • 举报
回复
建立线程 很好用啊。。只要设计合理, 结构很清晰的, 比起数据流里面自带的方便多了。

DoSomeThing()

DoSomeThingCompleted()
supercpu123 2009-07-01
  • 打赏
  • 举报
回复
第一种方法是你自己新建的线程,立刻执行
第二种方法是CLR从线程池中取线程来执行,如没有可用资源,可能需要等待

准则:若想要尽快地运行关联任务或者执行一个不常运行的耗时任务,应该选择Thread类,其他情况,应选择线程池来处理更可能扩展的服务器端任务.
windinwing 2009-07-01
  • 打赏
  • 举报
回复
线程方法不可以传参,要用别的方式实现了
异步回调接实方法参数。
导步回调你可以查询是否调用完成,或者等待方法完成,线程不能或者很麻烦

我觉得最有用的就是合理安排调用时间,通知机制、

另外,在线程中处理控件的时候你也不得不用委托
很多类都提供了异步方法,如 数据流类,webservice类,优势是在线程中判断一个方法是否执行完成无什么用处
 返回值也不好处理了。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧