Вы передаете TaskScheduler
как state
(или antecedent
, как вы его назвали).Это не имеет особого смысла.
Я не уверен, что именно вы хотите сделать, но вам нужно указать TaskScheduler
, когда вы запускаете Task
, а не когда вы 'воссоздаю это.Кроме того, кажется, что childTask
не обязательно должно быть полем:
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task childTask = null;
Task.Factory.StartNew(
() =>
{
Thread.Sleep(1000);
childTask.Start(scheduler);
Thread.Sleep(1000);
});
childTask = new Task(
() =>
{
Thread.Sleep(2000);
textBox1.Text = "From child task";
});
Конечно, все это будет гораздо проще с C # 5 и await
:
public Form1()
{
InitializeComponent();
StartAsync();
}
private async void StartAsync()
{
// do some work
await Task.Run(() => { Thread.Sleep(1000); });
// start more work
var moreWork = Task.Run(() => { Thread.Sleep(1000); });
// update the UI, based on data from “some work”
textBox1.Text = "From async method";
// wait until “more work” finishes
await moreWork;
}
Вы не можете сделать async
конструктор, но вы можете запустить из него метод async
.«Работа» не запускается в потоке пользовательского интерфейса, потому что он был запущен явно через Task.Run()
.Но поскольку StartAsync()
был вызван напрямую, он выполняется в потоке пользовательского интерфейса.