为什么在UI线程上调用启动新任务

Wil*_*iam 2 .net c# multithreading task-parallel-library

Task t = new Task(() =>
{
    //I would expect this to be on a worker thread, but it's not!
    Thread.Sleep(1000);
});

Task test = new Task(() =>
{
    Thread.Sleep(1000);
});

test.ContinueWith(x =>
{
    //Do some UI Updates here, but also start another Task running.
    t.Start();
}, TaskScheduler.FromCurrentSynchronizationContext());

test.Start();
Run Code Online (Sandbox Code Playgroud)

为什么t在UI线程上调用gets.据我所知,我创建了一个持续Task反对test其正确地被调用在UI线程上,但我然后开始一个新任务的运行.现在我知道我可以通过指定TaskScheduler.Default作为重载方法来解决这个问题t.Start,但是为什么Task在ui线程上开始新的?

i3a*_*non 5

但为什么新的Task开始在ui线程上?

因为除非另外指定,否则调用Start任务会调度当前的任务TaskScheduler,在您的情况下,该任务是SynchronizationContext您使用创建的UI线程的正面TaskScheduler.FromCurrentSynchronizationContext().

启动Task,将其安排执行到当前TaskScheduler.

Task.Start方法

如果您希望将该任务安排在TaskScheduler与当前任务不同的任务上,则可以将其作为参数传递:

t.Start(TaskScheduler.Defualt);
Run Code Online (Sandbox Code Playgroud)

注意:几乎没有可以想象的使用Task.Start是最好的解决方案.你应该重新考虑这个途径.