Запуск одного потока за раз в TaskScheduler (поток STA) - PullRequest
0 голосов
/ 30 января 2020

Я установил StaTaskScheduler потоков на 1, и я ожидал, что я получу один вывод отладки каждые 5 секунд, но в итоге получаю 10 с той же датой

private void Test() {
    for (int i = 0; i < 10; i++)
        Task.Factory.StartNew(() =>
        {
            Task.Delay(5000); //temp for long operation
            Debug.WriteLine(DateTime.Now);
        }, CancellationToken.None, TaskCreationOptions.None, MainWindow.MyStaThread);
}

public static StaTaskScheduler MyStaThread = 
        new StaTaskScheduler(numberOfThreads: 1);

Что я скучаю? Причина STA заключается в том, что позже он будет использоваться для извлечения значков, нуждающихся в STA, но этот тест должен проверить, что это делается последовательно.

1 Ответ

0 голосов
/ 30 января 2020

вы должны запускать задачи, используя MyStaThred.QueueTask, а не Task.Factory.Startnew:

private void Test() {
    for (int i = 0; i < 10; i++)
        MyStaThread.QueueTask(new Task(() =>
        {
            Task.Delay(5000); //temp for long operation
            Debug.WriteLine(DateTime.Now);
        }));
}

public static StaTaskScheduler MyStaThread = 
        new StaTaskScheduler(numberOfThreads: 1);

Task.Factory.Startnew использует. Net Framework внутренний пул потоков и не учитывает StaTaskScheduler ,

...