尝试理解TPL和async/ await在线程创建方面的区别.
我相信TPL(TaskFactory.StartNew)的工作方式类似于ThreadPool.QueueUserWorkItem它在线程池中的线程上排队工作.当然,除非您使用TaskCreationOptions.LongRunning哪个创建新线程.
我认为async/ await会以同样的方式工作:
TPL:
Factory.StartNew( () => DoSomeAsyncWork() )
.ContinueWith(
(antecedent) => {
DoSomeWorkAfter();
},TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)
Async/ Await:
await DoSomeAsyncWork();
DoSomeWorkAfter();
Run Code Online (Sandbox Code Playgroud)
会是相同的.从我一直在阅读它似乎async/ await只有"有时"创建一个新的线程.那么什么时候创建一个新线程,什么时候不创建一个新线程呢?如果您正在处理IO完成端口,我可以看到它不必创建新线程,但我认为它必须.我想我FromCurrentSynchronizationContext对此的理解总是有点模糊.我总是认为它本质上是UI线程.
假设我有100个任务需要10秒钟.现在我想一次只运行10个,就像10个中的1个完成另一个任务一样,直到完成所有任务.
现在我总是习惯于ThreadPool.QueueUserWorkItem()这样的任务,但我已经读到这样做是不好的做法,我应该使用任务.
我的问题是我没有找到适合我的方案的好例子,所以你能让我开始研究如何通过Tasks实现这个目标吗?
我发现自己想要实现一个 IAwaitable 类(实现异步调用而不阻塞线程的东西)。
我已经安装了最新版本的 AsyncCTP,并且编译器说我需要一个 IsCompleted() 成员。好的,所以 CTP 预览已经移动了一点(我明白了,就像预览一样)
问题:AsyncCTP 语言扩展现在期待什么接口?
问题:在所有这些中,我假设我可以通过 lamda/delegate 向“IAwaitable”发出信号?这可能吗?我们叫 EndAwait 吗?智能感知建议您调用 EndAwait 来检索结果......所以这听起来不对。有任何想法吗?
到目前为止,我发现的所有示例都针对 AsyncCTP 库已经实现的功能,例如:
await new WebClient().DownloadStringTaskAsync(uri).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)
背景:
我发现自己在 Jon Skeets 页面(再次)看着这个例子
using System;
class Test
{
static async void Main()
{
await new Awaitable();
}
}
class Awaitable
{
public Awaiter GetAwaiter()
{
return new Awaiter();
}
}
class Awaiter
{
public bool BeginAwait(Action continuation)
{
return false;
}
public int EndAwait()
{
return 1; …Run Code Online (Sandbox Code Playgroud)