如果这是一个简单的问题,请原谅我;我不能用足够通用的方式来表达它来搜索答案。
考虑以下代码:
var task = Task.Factory.StartNew(() => Whatever());
task.ContinueWith(Callback, TaskScheduler.FromCurrentSynchronizationContext())
在回调方法执行时究竟如何确定?
它会等到主线程当前完成正在做的事情,还是会在异步调用完成后立即调用?并且这个回调是否会在主线程返回之前执行的任何操作之前完全执行?
答案 0 :(得分:8)
它会等到主线程当前完成正在做的事情,还是会在异步调用完成后立即调用?
异步调用完成后,将继续计划。调度的效果取决于调度程序(当然),但对于“普通”WPF或Windows窗体消息循环,我希望它的调度方式与调用Control.BeginInvoke
或{{ 1}} - 换句话说,当“主”线程完成了在此之前安排的其余任务时。
我不希望主线程神奇地停止正在做的事情并执行延续。然而,可以使延续成为其队列中的高优先级任务。