【发布时间】:2013-09-26 16:00:52
【问题描述】:
好吧,让我试着用句子来表达......
让我们考虑一个例子,
我创建了一个async 方法并使用await 关键字调用它,
据我所知,
- 主线程将被释放
- 在单独的线程中,异步方法将开始执行
- 一旦它被执行,指针将从它留在主线程中的最后一个位置恢复。
问题一:会回到主线程还是新线程?
问题 2: 如果异步方法受 CPU 限制或网络限制,有什么区别吗?如果是,是什么?
重要的问题
问题 3: 假设这是一个 CPU 密集型方法,我实现了什么?我的意思是 - 主线程被释放,但同时,另一个线程从线程池中使用。有什么意义?
【问题讨论】:
-
对您的进程进行一次更正,进程进行 1) 主线程执行该函数直到
await关键字,在此之前的某个时间点,一个新线程启动并在后面工作地面。 2) 主线程停止处理该函数并开始处理消息队列中的其他消息,3) 一旦后台函数完成,它会将一条新消息放入消息队列中,该消息将重新启动async函数离开await关键字的位置是。 -
回答问题 3,重点是您的主线程通常执行一组与您的方法不严格相关的指令(例如渲染 UI),因此分配另一个线程来执行 CPU 密集型计算将使您的“软件”避免冻结
-
好的,所以除了让 ui 响应更快之外,没有其他优势。我以为我会在一段时间内免费获得一个额外的线程。
-
async/await本身与线程关系不大。简单地将async添加到方法签名中不会改变代码的行为(并且绝对不会创建额外的线程),除非此方法将开始使用真正的异步方法并使用 await 调用它们。 -
@BilalFazlani - SO 是一个问答网站,我在您的问题中看到 5 个问号,您真正想要的是涵盖整个主题,而不是提出特定问题..
标签: c# asp.net multithreading c#-4.0 asynchronous