c# 异步的几个问题请教。

学多线程和异步不是很久,都是在网上搜些代码然后自己测试一下,并没有应用到真正的项目里面。我下面说的异步指的是BeginInvoke这种写法,是.net 4.0的,而不是.net 5的async的。
异步是否是多线程的封装?
异步的完成回调与事件的(本质上的)异同?
网上多说用异步相对于多线程的好处是异步不像多线程那样容易发生死锁,请问是真的吗,如何做到的?
BeginInvoke后直接EndInvoke,不用IAsyncResult回调,仍然会造成UI不响应,那我想问这个EndInvoke存在的合理性何在,也就是为什么微软不限制为只有通过IAsyncResult回调才能使用异步?

1> 是

2> begininvoke是异步 事件是同步 没了..
其实我不太理解你问题的用意... 事件其实是委托的封装 而在执行事件委托的时候也可以异步执行... 可以说两个东西没有什么本质的关联..
非要说的话 事件可以用+=注册多个回调方法 ... 异步么... 对于一个IAsyncResult只有一个吧...
3> 啊 和死锁关系不大... 异步和多线程其实本质都是多线程 而异步用的是线程池 thread是自己创建的线程而已.... 自己创建大量线程调度起来当然没有线程池性能好... 但是优点就是可以自己调整线程的优先度 也可以随时挂起或终止线程... 所以和死锁没什么关系 你误解了-w-
4> 那么我想反问你... begin然后直接就endinvoke 这样写合理性何在...
EndInvoke是等待异步执行完成(若未完成)并返回结果的方法... 你直接endInvoke 那边可能线程池还没调度好呢... 这样就相当于执行一个同步方法了.... 当然 如果这是你期待的结果...
AsyncResult里面其实封装了一个线程锁.... 执行EndInvoke时如果这个锁是阻塞状态(也就是等待原方法返回的状态) 肯定就会阻塞当前线程了...

Thread Task BeginInvoke ThreadPool Parallel等等其实都是一种多线程的实现

只是看你如何用起来比较方便罢了-w-
温馨提示:答案为网友推荐,仅供参考