比方说,我有一个同步运行的方法fooCPU
(它不会调用执行I/O的纯异步方法,或通过调用Task.Run
或类似的方法使用其他线程来运行其代码)。该方法执行一些繁重的计算 - 它受CPU限制。UI线程有什么特别之处?
现在我在我的程序中调用fooCPU
而不委托它由工作线程执行。如果一行fooCPU
将花费很长时间运行,那么在完成之前不会执行其他行。例如,从UI线程调用它会导致UI线程冻结(GUI将变为无响应)。
当我说async/await
是一个模仿多线程。两条不同代码的代码在单个线程中轮流执行。如果其中一条线路需要很长时间才能运行,则不会执行其他线路,直至完成。,
我已经被告知在UI线程中使用async是正确的,但对于所有其他情况(ASP.NET,线程池上的异步,控制台应用程序等)并非如此。
谁能告诉我这可能意味着什么? UI线程与控制台程序的主线程有何不同?
我认为没有人希望这个论坛上的任何人继续讨论相关主题,因为它们出现在评论中,所以最好提出一个新问题。
我会在win窗体应用程序和控制台应用程序上编译相同的代码,并使用ildasm或反射器检查编译的IL的差异以查看我自己。 –
@OguzOzgul这对许多问题很有用,但不是这个 - 代码完全一样。全局状态有哪些变化 - 同步上下文的存在。 – Luaan
答案相当不错,但唯一能满足你好奇心的就是明白等待的细节。搜索“.net等待内部”看起来很不错。如果你有一个小时的时间,这将会回答一切,我希望。 – usr