﻿using System;
using System.Threading.Tasks;
using System.Threading;

namespace examples
{

    class Foo
    {
        public int bar = 1;
    }
    class Program
    {

        static void RT(Action action, int seconds, CancellationToken token)
        {
            if (null == action)
            {
                return;
            }

            Task.Run(async () =>
            {
                while (!token.IsCancellationRequested)
                {
                    action();
                    await Task.Delay(TimeSpan.FromSeconds(seconds), token);
                }
            });
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            string accessKey = "key";
            string accessSecret = "secret";
            var credentials = new Org.Apache.Rocketmq.StaticCredentialsProvider(accessKey, accessSecret).getCredentials();
            bool expired = credentials.expired();

            int workerThreads;
            int completionPortThreads;
            ThreadPool.GetMaxThreads(out workerThreads, out completionPortThreads);
            Console.WriteLine($"Max: workerThread={workerThreads}, completionPortThreads={completionPortThreads}");
            ThreadPool.GetMinThreads(out workerThreads, out completionPortThreads);
            Console.WriteLine($"Min: workerThread={workerThreads}, completionPortThreads={completionPortThreads}");

            ThreadPool.QueueUserWorkItem((Object stateInfo) =>
            {
                Console.WriteLine("From ThreadPool");
                if (stateInfo is Foo)
                {
                    Console.WriteLine("Foo: bar=" + (stateInfo as Foo).bar);
                }
            }, new Foo());

            var cts = new CancellationTokenSource();
            RT(() =>
            {
                Console.WriteLine("Hello Again" + Thread.CurrentThread.Name);
            }, 1, cts.Token);
            cts.CancelAfter(3000);
            Console.ReadKey();
        }
    }
}
