【问题标题】:Runing one thread at a time on TaskScheduler (STA thread)在任务计划程序(STAthread)上一次运行一个线程
【发布时间】:2020-01-30 16:30:36
【问题描述】:

我已将 StaTaskScheduler 线程设置为 1,我希望每 5 秒得到一个 Debug 输出,但我最终得到 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的Icons提取,但是这个测试是为了检查它是否按顺序完成。

【问题讨论】:

  • 你的预期输出是什么?打印 DateTime.Now 每 5 秒。没有得到你
  • 您认为Task.Delay 模拟长时间运行的操作是不正确的。 Task.Delay 是基于计时器的,不会阻塞调用它的线程,因此您的任务会一一完成,但几乎是立即完成。所以毫不奇怪,您会为它们观察到相同的时间戳。
  • @DmytroMukalov 谢谢,它应该是Thread.Sleep(2500);,然后就可以了

标签: c# multithreading task task-parallel-library taskfactory


【解决方案1】:

您必须使用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

【讨论】:

  • 这不会解决问题 Task.Delay 不会锁定广告
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2020-10-23
  • 2020-12-03
  • 1970-01-01
  • 2014-12-29
相关资源
最近更新 更多