相关疑难解决方法(0)

Async等待关键字等同于ContinueWith lambda吗?

请有人能够确认我是否正确理解了Async await关键字吗?(使用CTP的第3版)

到目前为止,我已经解决了在方法调用之前插入await关键字基本上做了两件事,A.它创建一个立即返回和B.它创建一个"延续",在完成异步方法调用时调用.在任何情况下,continuation都是该方法的代码块的其余部分.

所以我想知道的是,这两位代码在技术上是等价的,如果是这样,这基本上意味着await关键字与创建ContinueWith Lambda相同(即:它基本上是一个编译器快捷方式)?如果没有,有什么区别?

bool Success =
    await new POP3Connector(
        "mail.server.com", txtUsername.Text, txtPassword.Text).Connect();
// At this point the method will return and following code will
// only be invoked when the operation is complete(?)
MessageBox.Show(Success ? "Logged In" : "Wrong password");
Run Code Online (Sandbox Code Playgroud)

VS

(new POP3Connector(
    "mail.server.com", txtUsername.Text, txtPassword.Text ).Connect())
.ContinueWith((success) =>
    MessageBox.Show(success.Result ? "Logged In" : "Wrong password"));
Run Code Online (Sandbox Code Playgroud)

c# continuations async-await async-ctp

79
推荐指数
2
解决办法
2万
查看次数

TaskCompletionSource - 尝试理解无线程异步工作

我试图了解其目的TaskCompletionSource及其与异步/无线工作的关系.我想我有一般的想法,但我想确保我的理解是正确的.

我首先开始研究任务并行库(TPL),以确定是否有一种很好的方法来创建自己的无线/异步工作(比如说你试图提高ASP.NET站点的可伸缩性)以及对TPL的理解看起来它将来会非常重要(async/ await).这导致我TaskCompletionSource.

从我的理解来看,添加TaskCompletionSource到你的一个类似乎没有做太多的编码异步; 如果您仍在执行同步代码,则对代码的调用将被阻止.我认为微软API也是如此.例如,假设在DownloadStringTaskAsync关闭的WebClient类,它们最初在做任何安装/同步代码将被阻塞.您正在执行的代码必须在某个线程上运行,无论是当前线程还是您必须分拆一个新线程.

因此TaskCompletionSource,当您调用asyncMicrosoft的其他调用时,您可以在自己的代码中使用,这样您的类的客户端就不必为您的类创建一个新的线程来阻止它.

不确定Microsoft如何在内部执行异步API.例如,for .Net 4.5 有一种新async方法SqlDataReader.我知道有IO完成端口.我认为这可能是大多数C#开发人员不会使用的低级抽象(C++?).不确定IO完成端口是否适用于数据库或网络调用(HTTP),或者它是否仅用于文件IO.

所以问题是,我理解正确吗?是否有某些我错误表示的事情?

asynchronous task-parallel-library

35
推荐指数
2
解决办法
2万
查看次数