0

(楽しみのために) Sheduler を作成しようとしていますが、失敗します。奇妙なことに、ステップ オーバー スタイルでデバッグしている場合、プログラムは正常に動作しますが、すべてのブレークポイントを削除すると、最後の値を出力した後にフリーズします。質問: なぜフリーズするのですか? 2番目:私は と を使用Thread.ResumeThread.Suspendていますが、それらは廃止されているとマークされています。どうすれば回避できますか?

コードは以下のとおりです。

using System;
using System.Collections.Generic;
using System.Threading;

namespace ConsoleApplication143
{
    internal class Program
    {
        private static void Main()
        {
            var rrs = new RobinRoundSheduler(2, () =>
                                                {
                                                    for (int i = 0; i < 2; i++)
                                                    {
                                                        Console.WriteLine("{0} {1}", i,
                                                                          Thread.CurrentThread.ManagedThreadId);
                                                    }

                                                }) {TimeForTask = new TimeSpan(1)};
            rrs.Start();
            Console.ReadKey();
        }
    }


    internal class RobinRoundSheduler
    {
        private readonly LinkedList<Thread> _threads;
        public TimeSpan TimeForTask { get; set; }

        public RobinRoundSheduler(int taskCount, ThreadStart start)
        {
            TimeForTask = TimeSpan.FromSeconds(1);
            _threads = new LinkedList<Thread>();
            for (int i = 0; i < taskCount; i++)
            {
                _threads.AddLast(new Thread(start));
            }
        }

        public void Start()
        {
            while (_threads.Count > 0)
            {
                var list = new List<Thread>();
                foreach (var thread in _threads)
                {
                    lock (thread)
                    {
                        if (thread.ThreadState == ThreadState.Unstarted)
                            thread.Start();
                        else
                            thread.Resume();
                    }
                    thread.Join(TimeForTask);
                    lock (thread)
                    {
                        if (thread.ThreadState == ThreadState.Stopped || thread.ThreadState == ThreadState.Aborted)
                            list.Add(thread);
                        else
                        {
                            thread.Suspend();
                        }
                    }
                }
                list.ForEach(thread => _threads.Remove(thread));
            }
        }
    }
}

Thread.Suspend() メソッドが原因でデッドロックの問題が発生しているようですが、メソッドの呼び出しで ManualResetEvents のチェックを追加せずにスレッドを一時停止する別の方法はありません。しかし、メソッドを呼び出したいのですが、マルチスレッドについて何も知りません。

4

0 に答える 0