Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 108,374

HOME > .NET Framework > Forum > C# จะเขียน thread แบบนี้ ในรูปแบบ lambda ได้ยังไง ครับ



 

C# จะเขียน thread แบบนี้ ในรูปแบบ lambda ได้ยังไง ครับ

 



Topic : 135110



โพสกระทู้ ( 4,045 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook



Code (C#)
/* void ShowThreadInformation(Object state)
        {
            Object obj = new Object();
            lock (obj)
            {
                var th = Thread.CurrentThread;
                Console.WriteLine("Managed thread #{0}: ", th.ManagedThreadId);
                Console.WriteLine("   Background thread: {0}", th.IsBackground);
                Console.WriteLine("   Thread pool thread: {0}", th.IsThreadPoolThread);
                Console.WriteLine("   Priority: {0}", th.Priority);
                Console.WriteLine("   Culture: {0}", th.CurrentCulture.Name);
                Console.WriteLine("   UI culture: {0}", th.CurrentUICulture.Name);
                Console.WriteLine();
            }
        }*/
        private void ThreadClass_4()
        {
             Action<object> ShowThreadInformation =(state) =>
             {
                 Object obj = new Object();
                 lock (obj)
                 {
                     var th = Thread.CurrentThread;
                     Console.WriteLine("Managed thread #{0}: ", th.ManagedThreadId);
                     Console.WriteLine("   Background thread: {0}", th.IsBackground);
                     Console.WriteLine("   Thread pool thread: {0}", th.IsThreadPoolThread);
                     Console.WriteLine("   Priority: {0}", th.Priority);
                     Console.WriteLine("   Culture: {0}", th.CurrentCulture.Name);
                     Console.WriteLine("   UI culture: {0}", th.CurrentUICulture.Name);
                     Console.WriteLine();
                 }
             };
            ThreadPool.QueueUserWorkItem(ShowThreadInformation);
            var th1 = new Thread(ShowThreadInformation);
            th1.Start();
            var th2 = new Thread(ShowThreadInformation);
            th2.IsBackground = true;
            th2.Start();
            Thread.Sleep(500);
            ShowThreadInformation(null);


        }




1

2


ประเด็นคือ อยากลองเขียนให้เป็น แบบ action หรือ func ครับ

ในกรณีที่ไม่มี parameter จะใช้ได้ครับ

3

แต่พอเพิ่ม parameter กลับ Error เลยอยากรู้ว่าต้องเขียนยังไง ครับ



Tag : .NET, Web (ASP.NET), Win (Windows App), C#, VS 2017 (.NET 4.x)









ประวัติการแก้ไข
2020-04-12 23:00:49
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2020-04-12 16:24:50 By : lamaka.tor View : 128 Reply : 6
 

 

No. 1



โพสกระทู้ ( 1,157 )
บทความ ( 0 )



สถานะออฟไลน์
Twitter Facebook Blogger

มันคนละอย่างกันครับ

https://stackoverflow.com/questions/41098518/why-cant-an-actionobject-delegate-be-used-as-a-waitcallback-for-threadpool






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2020-04-12 17:43:32 By : PhrayaDev
 


 

No. 2



โพสกระทู้ ( 4,045 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 1 เขียนโดย : PhrayaDev เมื่อวันที่ 2020-04-12 17:43:32
รายละเอียดของการตอบ ::
ผมงง ตรงที่ว่า
ตัว ThreadClass_1 ผมก็เขียนโดยใช้ action เหมือนกัน แต่มันก็ใช้ได้ครับ
ThreadClass_4 ผมเพิ่ม parameter ใน action เป็น object มันใช้ไม่ได้
ทั้งๆที่ ถ้าเขียนเป็น แบบนี้

Code (C#)
void ShowThreadInformation(Object state)
        {
            Object obj = new Object();
            lock (obj)
            {
                var th = Thread.CurrentThread;
                Console.WriteLine("Managed thread #{0}: ", th.ManagedThreadId);
                Console.WriteLine("   Background thread: {0}", th.IsBackground);
                Console.WriteLine("   Thread pool thread: {0}", th.IsThreadPoolThread);
                Console.WriteLine("   Priority: {0}", th.Priority);
                Console.WriteLine("   Culture: {0}", th.CurrentCulture.Name);
                Console.WriteLine("   UI culture: {0}", th.CurrentUICulture.Name);
                Console.WriteLine();
            }
        }


มันก็ใช้ได้ปกติ

เพียงแต่ผมกำลังหัดเขียนโค้ด แบบ action/func อยู่ ผมจึงจำเป็นต้องเขียนมันให้เป็นรูปแบบ action/func ครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2020-04-12 23:08:35 By : lamaka.tor
 

 

No. 3



โพสกระทู้ ( 1,157 )
บทความ ( 0 )



สถานะออฟไลน์
Twitter Facebook Blogger

Action เป็น Delegate ที่ไม่คืนค่า และสามารถ
กำหนด Type ของ Parameter ได้อย่างอิสระ
ในขณะเดียวกัน Action ยังเป็น Type เองด้วย
การเริ่ม Thread โดยใส่ parameter จึง
ต้องใช้ Delegate ตาม Constructors
ที่สนับสนุน Method Signature ของ Thread Class

Thread Class Constructors:
Thread(Parameterized​Thread​Start) Thread(Parameterized​Thread​Start, Int32) Thread(Thread​Start) Thread(Thread​Start, Int32)


Thread Class มี delegate argument 2 ตัว คือ Thread​Start กับ Parameterized​Thread​Start

Thread​Start สำหรับ signature ที่ไม่มี argument
[System.Runtime.InteropServices.ComVisible(true)] public delegate void ThreadStart();


ส่วน Parameterized​Thread​Start แบบมี 1 argument ซึ่งก็คือ object
[System.Runtime.InteropServices.ComVisible(false)] public delegate void ParameterizedThreadStart(object obj);


ในทำนองเดียวกันการใช้เมธอด Queue​User​Work​Item ของ Thread​Pool
ก็ต้องใช้ delegate ที่มี type ตาม Overloads ของมัน

Thread​Pool.​Queue​User​Work​Item Method Overloads:
QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback, Object)


argument ของ Queue​User​Work​Item ที่เป็น delegate มีแค่ WaitCallback
ซึ่งมี method signature เป็นแบบ 1 argument ที่มี type เป็น object

[System.Runtime.InteropServices.ComVisible(true)] public delegate void WaitCallback(object state);


ตัวอย่างการใช้งาน

Code (C#)
using System;
using System.Threading;

namespace ProgramConsole {
	public class Program {
		public static void Main(string[] args) {
			ThreadClass_4();
		}

		private static void ThreadClass_4() {
			
			WaitCallback ShowThreadInformationW = (state) => MyMethod("Test " + state);
			ParameterizedThreadStart ShowThreadInformation = (state) => MyMethod(state);
			
			ThreadPool.QueueUserWorkItem(ShowThreadInformationW, "ThreadPoolState");
			var th1 = new Thread(ShowThreadInformation);
			th1.Start("th1");
			var th2 = new Thread(ShowThreadInformation);
			th2.IsBackground = true;
			th2.Start("th2");
			Thread.Sleep(500);
			ShowThreadInformation(null);

		}
		
		private static void MyMethod (Object o) {
				Object obj = new Object();
				lock(obj) {
					var th = Thread.CurrentThread;
					Console.WriteLine("Managed thread #{0}: ", th.ManagedThreadId);
					Console.WriteLine("   Background thread: {0}", th.IsBackground);
					Console.WriteLine("   Thread pool thread: {0}", th.IsThreadPoolThread);
					Console.WriteLine("   Priority: {0}", th.Priority);
					Console.WriteLine("   Culture: {0}", th.CurrentCulture.Name);
					Console.WriteLine("   UI culture: {0}", th.CurrentUICulture.Name);
					Object ol = (o == null) ? "Parameter is null" : o;
					Console.WriteLine(ol);
					Console.WriteLine();
				}
			}
	}
}



หรือ แนวขี้เกียจ โดยใช้ wrapper ของ delegate จำเป็น (Invoke เทียม)
(Parameterized​Thread​Start ของ Thread Class กับ WaitCallback ของ Thread​Pool.​Queue​User​Work​Item Method)
ด้วยคำสั่ง : {ชื่อ Action delegate}.Invoke

Code (C#)
using System;
using System.Threading;

namespace ProgramConsole {
	public class Program {
		public static void Main(string[] args) {
			ThreadClass_4();
		}

		private static void ThreadClass_4() {
			Action < object > ShowThreadInformation = (state) => {
				Object obj = new Object();
				lock(obj) {
					var th = Thread.CurrentThread;
					Console.WriteLine("Managed thread #{0}: ", th.ManagedThreadId);
					Console.WriteLine("   Background thread: {0}", th.IsBackground);
					Console.WriteLine("   Thread pool thread: {0}", th.IsThreadPoolThread);
					Console.WriteLine("   Priority: {0}", th.Priority);
					Console.WriteLine("   Culture: {0}", th.CurrentCulture.Name);
					Console.WriteLine("   UI culture: {0}", th.CurrentUICulture.Name);
					Console.WriteLine();
				}
			};
			ThreadPool.QueueUserWorkItem(ShowThreadInformation.Invoke);
			var th1 = new Thread(ShowThreadInformation.Invoke);
			th1.Start();
			var th2 = new Thread(ShowThreadInformation.Invoke);
			th2.IsBackground = true;
			th2.Start();
			Thread.Sleep(500);
			ShowThreadInformation(null);

		}
	}
}



ประวัติการแก้ไข
2020-04-14 00:35:03
2020-04-14 00:38:12
2020-04-14 00:42:13
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2020-04-14 00:31:06 By : PhrayaDev
 


 

No. 4



โพสกระทู้ ( 4,045 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 3 เขียนโดย : PhrayaDev เมื่อวันที่ 2020-04-14 00:31:06
รายละเอียดของการตอบ ::
แบบนี้ นี่เอง ขอบคุณมากครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2020-04-14 08:08:38 By : lamaka.tor
 


 

No. 5



โพสกระทู้ ( 4,045 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 3 เขียนโดย : PhrayaDev เมื่อวันที่ 2020-04-14 00:31:06
รายละเอียดของการตอบ ::
ขอถามอีกหน่อยครับ
กรณีที่ ผมต้องการ ทำงานประมาณนี้ ครับ

1. อ่านค่าทั้งหมดในแต่ละโฟลเดอร์ ซึ่งจะมีโฟลเดอร์ละ 10-500 ไฟล์ อาจจะ เป็นแค่การเก็บรายละเอียดไฟล์ เช่น ชื่อไฟล์ ขนาด วันแก้ไข ฯลฯ
2. การทำงานให้ทำทีละ โฟลเดอร์ และ ในแต่ละโฟลเดอร์ ให้ทำพร้อมๆกัน เมื่อครบทุกไฟล์ ในโฟลเดอร์ ให้เริ่ม โฟลเดอร์ใหม่

อย่างในกรณีนี้ ควรใช้ อะไรมาช่วยบ้างครับ

Thread/ThreadPool/Task/other


แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2020-04-14 08:29:43 By : lamaka.tor
 


 

No. 6



โพสกระทู้ ( 1,157 )
บทความ ( 0 )



สถานะออฟไลน์
Twitter Facebook Blogger

การทำงานพร้อมกัน คือ parallel

ลองอ่านดูข้อแตกต่าง ข้อดีและข้อจำกัดระหว่าง Thread กับ Task แล้วตัดสินใจเองนะครับ
https://stackoverflow.com/questions/4130194/what-is-the-difference-between-task-and-thread
https://stackoverflow.com/questions/13429129/task-vs-thread-differences

ที่น่าสนใจคือ IO bound/CPU bound...มีตัวอย่างปัญหาที่ต้องใช้ทั้งสองอย่าง
https://stackoverflow.com/questions/20928705/read-and-process-files-in-parallel-c-sharp

Task + ThreadPool
https://www.c-sharpcorner.com/UploadFile/1d42da/threading-pooling-in-C-Sharp/

TaskScheduler (กรณีต้องการจำกัดจำนวน)
https://social.msdn.microsoft.com/Forums/office/en-US/21b068ef-4ef6-4981-8208-0ed6d0153de0/multithreading-reading-multiple-files?forum=csharpgeneral
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2020-04-14 13:06:14 By : PhrayaDev
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : C# จะเขียน thread แบบนี้ ในรูปแบบ lambda ได้ยังไง ครับ
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: Voake, Comcube, รับทำเว็บไซต์ รับเขียนโปรแกรม , รับทำบัญชี , โรงงานผลิตครีม , สำนักงานบัญชี , รับจดทะเบียนบริษัท , Pangpond , รถมือสอง

Load balance : Server 01
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2020 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่