Приоритетные потоки не выполняют свою работу в ожидаемом порядке - PullRequest
0 голосов
/ 06 мая 2018

в школе мне дали задание создать простое приложение, чтобы показать, как работают приоритеты потоков. Проблема в том, что потоки, которые я запускаю, не придерживаются установленных приоритетов и заканчиваются случайным образом (или это выглядит так).

Вот код для моего главного окна:

namespace ThreadsShowtime
{
    public partial class MainWindow : Window
    {
        private SuperThread _lowest;
        private SuperThread _below;
        private SuperThread _normal;
        private SuperThread _above;
        private SuperThread _highest;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void ButtonClick(object sender, RoutedEventArgs e)
        {
            _lowest = new SuperThread(ThreadPriority.Lowest, elipseLowest, Dispatcher, lowestLbl);
            _below = new SuperThread(ThreadPriority.BelowNormal, elipseBelow, Dispatcher, belowLbl);
            _normal = new SuperThread(ThreadPriority.Normal, elipseNormal, Dispatcher, normalLbl);
            _above = new SuperThread(ThreadPriority.AboveNormal, elipseAbove, Dispatcher, aboveLbl);
            _highest = new SuperThread(ThreadPriority.Highest, elipseHighest, Dispatcher, highestLbl);

            _lowest.Start();
            _below.Start();
            _normal.Start();
            _above.Start();
            _highest.Start();
        }
    }
}

И код класса SuperThread:

namespace ThreadsShowtime
{
    public class SuperThread
    {
        private readonly Stopwatch _stopwatch;
        public readonly Thread Thread;

        public SuperThread(ThreadPriority thp, Shape sh, Dispatcher dispatcher, ContentControl lbl)
        {
            Thread = new Thread(() => DummyMethod(dispatcher, sh, lbl)) {Priority = thp};
            _stopwatch = new Stopwatch();
        }

        public long Elapsed { get; private set; }
        public double ElapsedSeconds => Elapsed / 1000.0;


        private void DummyMethod(Dispatcher dispatcher, Shape sh, ContentControl lbl)
        {
            _stopwatch.Start();
            dispatcher.Invoke(() =>
            {
                sh.Fill = Brushes.GreenYellow;
            }, DispatcherPriority.Normal);    

            for (var idx = 0; idx < 30000; idx++) Console.WriteLine(idx);

            dispatcher.Invoke(() =>
            {
                sh.Fill = Brushes.OrangeRed;
            }, DispatcherPriority.Normal);

            _stopwatch.Stop();
            Elapsed = _stopwatch.ElapsedMilliseconds;

            dispatcher.Invoke(() =>
            {
                lbl.Content = ElapsedSeconds;
            }, DispatcherPriority.ContextIdle);

        }

        public void Start()
        {
            Thread.Start();
        }
    }
}

Вывод этого приложения выглядит так: Output

Почему это происходит? Большое спасибо за любую предоставленную помощь.

1 Ответ

0 голосов
/ 06 мая 2018

Из-за dispatcher.Invoke() и Console.WriteLine() ваш код фактически является однопоточным. То, что вы видите, - это несколько непредсказуемые результаты постановки в очередь. Эти очереди не FIFO.

Чтобы увидеть правильный эффект, выполните тестирование некоторого кода, который связан только с процессором, например, Sort (). Убедитесь, что они работают> 200 мс, меньшие прогоны не имеют смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...