.net 异步和异步方法澄清?
AFAIK-(我读了很多关于它的书),异步方法(非异步委托!)可以解决处理I/O操作时的“线程被阻塞”问题,例如:读取文件或下载文件: 里克特在这里非常清楚地表明了这一点:.net 异步和异步方法澄清?,.net,task-parallel-library,task,async-await,c#-5.0,.net,Task Parallel Library,Task,Async Await,C# 5.0,AFAIK-(我读了很多关于它的书),异步方法(非异步委托!)可以解决处理I/O操作时的“线程被阻塞”问题,例如:读取文件或下载文件: 里克特在这里非常清楚地表明了这一点: 任务与i/o阻塞问题无关。这很简单,就像打开一个线程(加上额外的效率+功能)-但它仍然会导致线程消耗cpu数量等 我的问题是: 我已经读到(msdn)了: async方法提供了一种方便的方法来执行此操作 长时间运行的工作,而不阻塞调用者的线程。呼叫者 异步方法可以在不等待异步消息的情况下恢复其工作 方法完成 这是否就
与i/o阻塞问题无关。这很简单,就像打开一个线程(加上额外的效率+功能)-但它仍然会导致线程消耗cpu数量等任务
- 这是否就像用
创建ContinueWith
任务一样
- 这个术语不令人困惑吗<代码>异步方法用于
操作(在执行i/o操作时,有零个线程等待,而没有线程处理)但是将代码(使用异步)调用为:i/o
有点混乱。你不觉得吗?因为我假设有另一个线程正在执行…(这实际上是我的第一个问题)异步方法
Task
和ContinueWith
是一样的--ContinueWith
实际上只是谈论回调的另一种方式
“异步”一词的简单意思是“不在同一时间”——它可以指任何独立于彼此发生的动作
任务
与I/O阻塞问题无关。这就像打开一个线程(再加上额外的效率和功能)——但它仍然会导致线程消耗CPU数量等
不一定。基本上有两种任务:一种执行一段同步代码,并在该代码执行完毕时完成。这种任务
在线程
开始执行到完成(成功与否)的整个过程中都会阻塞线程
但是还有另一种任务:当事情发生时完成的任务。这种任务
是.NET4.5和C#5.0大量使用的,它不会阻止线程
(至少不会直接阻止)。您可以使用TaskCompletionSource
自己创建这样的Task
(另一点是,被阻塞的线程不会消耗任何CPU,但这与此无关。)
这是否就像用ContinueWith
创建任务一样
是的,await t t
与t非常相似
这个术语不令人困惑吗?异步方法用于I/O操作(在进行I/O操作时有零个线程等待,没有线程处理)。但是将代码(使用异步)调用为:异步方法有点混乱。你不觉得吗?因为我假设有另一个线程正在执行
我看不出有什么混乱。经典的异步方法(如BeginRead()
;这称为“异步编程模型”或APM)是一种启动操作并在操作完成时收到通知的方法(通过回调)。现代异步方法(如ReadAsync()
;这称为“基于任务的异步模式”或TAP)也是一种启动操作并在操作完成时收到通知的方法(使用wait
)
在这两种情况下,可能会有一些代码在方法返回之前执行(在TAP情况下,第一个wait
之前的代码)
在这两种情况下,通知结果的通常方式不会阻止任何线程(APM的回调,wait
TAP)
在这两种情况下,如果需要,可以使用阻塞等待(立即调用APM的EndXxx()
方法,调用TAP的wait()
)
这两种情况都可用于在后台线程上执行同步代码(BeginInvoke()
用于APM的委托,Task.Factory.StartNew()
用于TAP)
再一次,我没有看到混淆,这两个模型似乎与我非常相似。嗨。“两种任务”是什么意思?只有任务
在另一个线程上执行。(每个线程都得到量子)。我不知道你说的是哪两种任务。@RoyiNamir只有一种类型(Task
),但它实际上可以表示两种不同类型的任务。另一种任务
s不使用线程
。您看过TaskCompletionSource
了吗?但它只是作为任务外壳的任意函数的插件。(所以我可以把它当作一项任务)但它的最终结果是一项任务。(另一个用法是)。当然感谢您的回复(一如既往)@RoyiNamir重点是,这种任务
不直接使用线程
。因此,当计时器滴答作响或调用APM方法回调或诸如此类的时候,它就完成了。这意味着它实际上是异步的。Albahari花了很多精力来开发Asynchrons遇到的