.net 异步和异步方法澄清?

.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方法提供了一种方便的方法来执行此操作 长时间运行的工作,而不阻塞调用者的线程。呼叫者 异步方法可以在不等待异步消息的情况下恢复其工作 方法完成 这是否就

AFAIK-(我读了很多关于它的书),异步方法(异步委托!)可以解决处理I/O操作时的“线程被阻塞”问题,例如:读取文件或下载文件:

里克特在这里非常清楚地表明了这一点:

  • 任务
    与i/o阻塞问题无关。这很简单,就像打开一个线程(加上额外的效率+功能)-但它仍然会导致线程消耗cpu数量等
我的问题是:

我已经读到(msdn)了:

async方法提供了一种方便的方法来执行此操作 长时间运行的工作,而不阻塞调用者的线程。呼叫者 异步方法可以在不等待异步消息的情况下恢复其工作 方法完成

  • 这是否就像用
    ContinueWith
    创建
    任务一样

  • 这个术语不令人困惑吗<代码>异步方法用于
    i/o
    操作(在执行i/o操作时,有零个线程等待,而没有线程处理)但是将代码(使用异步)调用为:
    异步方法
    有点混乱。你不觉得吗?因为我假设有另一个线程正在执行…(这实际上是我的第一个问题)

混乱来自哪里?

因为异步方法适用于:

p、 我在这里读了一些关于这个主题的问题,但是没有发现任何一个涉及到错误分类的问题,异步方法在这里处理io操作

异步方法不仅仅用于io-它们可以用于任何东西-是的,这只是说该方法的工作在单独的线程中执行的另一种方式。调用线程将工作卸载到单独线程的任何方法都可以正确地称为“异步”方法。这与
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遇到的