C# 스레드 실시간 모니터링 클래스 1개

2428 단어
c# 접촉 차이가 4개월이 채 되지 않았는데 작업 중에 사용된 것은 상태기와 실시간 제어이며 아래 라인의 실시간 모니터링 코드는 다음과 같다.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ACON.AIAV3.Common
{
    public class AutomateThread
    {
        public static Thread StartNew(ThreadStart start)
        {
            Thread t = new Thread(start);
            t.Start();

            return t;
        }

        public static Result Monitor(int nTimeOutMS, ThreadStart start)
        {
            Stopwatch sw = Stopwatch.StartNew();

            Thread t = AutomateThread.StartNew(() => { start(); });

            while (sw.ElapsedMilliseconds < nTimeOutMS)
            {
                if (!t.IsAlive)
                {
                    return new Result(true, false);
                }
                else
                {
                    Thread.Sleep(30);
                }
            }

            return new Result(false, true);
        }

        public static Result MonitorAll(int nTimeOutMS, params ThreadStart[] threadStart)
        {
            Stopwatch sw = Stopwatch.StartNew();
            IList<Thread> threads = new List<Thread>();
            bool bFinish;

            foreach (var item in threadStart)
            {
                var t = AutomateThread.StartNew(item);
                threads.Add(t);
            }

            while (sw.ElapsedMilliseconds <= nTimeOutMS)
            {
                bFinish = true;
                foreach (var item in threads)
                {
                    if (item.IsAlive)
                    {
                        Thread.Sleep(30);
                        bFinish = false;
                    }
                }

                if (bFinish)
                {
                    return new Result(true, false);
                }
            }

            return new Result(false, true);
        }
        
        public static void  WaitAll(params Thread[] threads)
        {
            Stopwatch sw = Stopwatch.StartNew();

            foreach(Thread t in threads)
            {
                while(t != null && t.IsAlive)
                {
                    Thread.Sleep(30);
                }
            }
        }
    }
}

코드가 비교적 간단하기 때문에 설명을 하지 않겠다.알 수 없는 부분은 메시지를 남겨도 됩니다.

좋은 웹페이지 즐겨찾기