Tag Archive tasks

c#: แบ่งงานช่วยกันรุมให้เสร็จโดย Tasks

cpu รุ่นใหม่ๆ สามารถทำงานได้พร้อมๆ กันหลายๆ งานในเวลาเดียวกัน ทำไมจะไม่เขียนโปรแกรมให้ทำงานพร้อมๆ กันจะได้เสร็จไว้ๆ ละ

ตัวอย่าง c# Console App

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    internal class Program
    {

        private static void Main(string[] args)
        {
            Dictionary<string,
            string> months = new Dictionary<string,
            string>() {
        {"01","January"},
        {"02","February"},
        {"03","March"},
        {"04","April"},
        {"05","May"},
        {"06","June"},
        {"07","July"},
        {"08","August"},
        {"09","September"},
        {"10","October"},
        {"11","November"},
        {"12","December"},
            };
            var reultsts = new List<List<string>>();
            Console.WriteLine("Start Main");
            reultsts = RunAsync(months).Result;
            Console.WriteLine("End Main get reultsts " + reultsts.Count() + " items");

            Console.ReadKey();
        }

        public static async Task<List<List<string>>> RunAsync(Dictionary<string, string> months)
        {
            var tasks = new List<Task>();
            var reultsts = new List<List<string>>();
            Console.WriteLine("Start RunAsync");
            foreach (KeyValuePair<string, string> item in months)
            {
                tasks.Add(Task.Run(() =>
                {
                    reultsts.Add(TaskRun(item.Key, item.Value).Result);
                }));
            }
            Task t = Task.WhenAll(tasks);
            try
            {
                t.Wait();
            }
            catch { }
            Console.WriteLine("End RunAsync");
            return reultsts;
        }

        public static async Task<List<string>> TaskRun(string key, string value)
        {
            Random random = new Random();
            string message;
            int sleep;
            var results = new List<string>();
            for (int i = 0; i < 2; i++)
            {
                sleep = random.Next(1, 10) * 1000;
                System.Threading.Thread.Sleep(sleep);
                message = "TaskRun month " + key + " " + i + " " + sleep;
                results.Add(message);
                Console.WriteLine("\t" + message);
            }
            return results;
        }
    }
}

จะเห็นว่าไม่ได้ทำงานตามลำดับเดือน แถมบางเดือนจะทำครั้งที่ 1 และครั้งที่ 2 ห่างกันมากด้วยซ้ำไปเพราะว่าการจำลองการทำงานด้วย sleep ที่สุ่มไว้ได้เวลาต่างกันมาก อันไหนทำเสร็จแล้วมันก็จะไปหยิบงานอื่นมาทำก่อนโดยไม่ต้องรอให้งานเสร็จตามลำดับ

จัดการผู้ใช้และสิทธิใน yii

หากจำเป็นที่จะต้องมีจัดการผู้ใช้และสิทธิการใช้งานใน yii ในรูปแบบที่ซับซ้อน ผู้ใช้มีหลายระดับชั้น แต่ละกลุ่มมีสิทธิในการสร้าง แก้ไข ลบ ดู หรือห้ามใช้งาน ไม่เหมือนกัน yii ได้เตรียม Authentication and Authorization ที่นิยมใช้กันคือ Role-Based Access Control หรือ rbac

แต่เพราะความซับซ้อนในการใช้งาน และต้องเขียน code ควบคุม จึงมักนิยมใช้ extension Yii Users และ Rights มาช่วย การลงไม่ยาก แต่มีหลายขั้นตอน ถ้าทำผิดขั้นตอนอาจจะทำให้ลงไม่สำเร็จ เคยทำตามวิธีทั้งในคู่มือและเว็บบอร์ดแต่ไม่สำเร็จ พยามอยู่นานกว่าจะทำได้ T_T อันนี้เป็นขั้นตอนที่ผมทำจนสำเร็จ

  1. download yii-rights จาก rights แตกใส่ /your-app/protected/modules/rights เช่น D:\xampp\htdocs\yii1\JumpFlower\protected\modules\rights
  2. เปิดไฟล์ ใน \your-app\protected\modules\user\data เช่น D:\xampp\htdocs\yii1\JumpFlower\protected\modules\user\data เลือกไฟล์ schema.mysql.sql ถ้าใช้ tablePrefix อื่นอาจจะมีปัญหาได้ ทางที่ดีไม่ควรใช้ สร้างตารางขึ้นมาใหม่ และแก้ field tbl_users.Lastvisit เป็น lastvisit_at
  3. เปิดไฟล์ /your-app/protected/config/main.php เพิ่มใน array 'components'
    	'components'=>array(
    ...
    		'authManager'=>array(
    				'class'=>'RDbAuthManager',
    				'connectionID'=>'db',
    				'defaultRoles'=>array('Authenticated', 'Guest'),
    		),
    		'user'=>array(
    				'class'=>'RWebUser',
    				// enable cookie-based authentication
    				'allowAutoLogin'=>true,
    				'loginUrl'=>array('/user/login'),
    		),
    ...
    	),

    เพิ่มใน array 'import'

    	'import'=>array(
    ...
    		'application.modules.rights.*',
    		'application.modules.rights.components.*',
    		'application.modules.user.components.*',
    		'application.modules.user.models.*',
    ...
    	),
    

    เพิ่มใน array 'modules'

    	'modules'=>array(
    ...
    		'rights'=>array(
    			'authenticatedName'=>'Authenticated',
    			'debug'=>false,
    			'install'=>true,
    			'superuserName'=>'Admin',
    			'userIdColumn'=>'id',
    			'userNameColumn'=>'username',
    		),
    		'user'=>array(
    			'tableProfileFields' => 'profiles_fields',
    			'tableProfiles' => 'profiles',
    			'tableUsers' => 'users'
    		),
    ...
    	),
    • เปิด browser ไปที่ url http://localhost/yii1/JumpFlower/index.php?r=rights
    • ตอบ yes พยามเปิดทุกอย่างให้กลุ่ม Authenticated อย่าลืม Assign ตัวเองเข้ากลุ่ม Authenticated

กว่าจะได้ แต่ถ้าได้คุ้มแน่นอน