Vin*_*cio 4 .net asynchronous task-parallel-library async-await
如果我在C#(任务)中启动一组异步操作,每次从Web下载一些内容然后我使用Task.WhenAny()处理第一个可用的任务结果,其他异步操作"等待"主线程处理结果?
我只能假设OS级别存在某种内部队列,它存储状态以及后台发生的下载结果.
我的问题是,这个队列位于何处,这个队列是否有任何危险,因为异步操作的结果尚未处理?
TPL任务调度跟踪这些任务通过开始Task.Run
,Task.Factory.StartNew
,Task.ContinueWith
,Task.Run
或Task.RunSynchronously
.
对于promise -style任务(使用创建的任务TaskCompletionSource
),引用由I/O完成回调或事件处理程序保存.Stephen Cleary有一篇与此类任务相关的博文.
对于编译器生成的状态机任务(由async
具有await
语句的方法返回的那些),任务保持活动,只要它等待的任何"内部"任务(或自定义等待者)是"在飞行中".在这种情况下,继续回调由任务等待者保存(例如TaskAwaiter
).此编译器生成的回调包含对环境("外部")任务的强烈间接引用.当"内部"任务完成时,将通过任一SynchronizationContext.Post
或TaskScheduler.Current
任务调度程序(如果在此时没有捕获同步上下文await
)调度回调.
在使用自定义等待者的情况下,可能需要对await
传递给的持续回调进行强有力的保持INotifyCompletion.OnCompleted
,以防止环境任务被垃圾收集,同时"在飞行中".
我的问题是,这个队列位于何处,这个队列是否有任何危险,因为异步操作的结果尚未处理?
如果任务排队的速度比完成的速度快,那么从长远来看,最终可能会耗尽内存.这是排队论处理的常见问题,它不是TPL任务特有的.
归档时间: |
|
查看次数: |
82 次 |
最近记录: |