برنامه نویسی ناهمزمان و چندرشته ای یک ویژگی مهم برای اشتراک زمانی و پردازش موازی است. برنامه نویسی غیرهمزمان می تواند از چندرشته ای (multithreading) استفاده کند یا خیر. در این آموزش به تعریف پوسس ها، نخ ها و روش کار با نخ ها در زبان سی شارپ می پردازیمتعریف پروسس (Process)
تعریف نخ (Thread)
چند نخی (multi threading)
مزاياي استفاده از Threadها
معايب استفاده از Thread ها
3ـ مديريت بيشتر روي خطاهاي مديريت نشده (Unhandled Exception).
کار با Thread ها در c#
کلاس Thread تنها یک ایجادکننده (Constructor) دارد که یک ThreadStart (که یک Delegate است) می گیرد. برای توابع static می توان مستقیما نام تابع را ارسال کرد. تابع نوشته شده باید هیچ پارامتری نداشته باشد و هیچ مقداری را نیز برنگرداند (یعنی void باشد) به این علت که تابع اصلی این گونه تعریف شده است.
بعد از ایجاد Thread می توانید آن را با Start، شروع کنید:
using System;
using System.Threading;
namespace sample1
{
class Program
{
static void Main(string[] args)
{
Thread thread = new Thread(DoTask);
}
thread.Start();
}
static public void DoTask()
{
Console.WriteLine("thread created...");
}
}
using System;
using System.Threading;
namespace sample1
{
static void Main(string[] args)
class Program
{
{
Thread thread = new Thread(DoTask);
thread.Name = "My new thread";// Asigning name to the thread
thread.Priority = ThreadPriority.AboveNormal;// Setting thread priority
thread.IsBackground = false;// Made the thread forground
thread.Start();// Start DoTask method in a new thread
Console.WriteLine("thread created...");
//Do other task in main thread
}
static public void DoTask()
{
}
}
using System;
using System.Threading;
public class MyThread {
public static void Thread1() {
for (int i = 0; i < 10; i++) {
}
Console.WriteLine("Thread1 {0}", i);
}
Console.WriteLine("Thread2 {0}", i);
public static void Thread2() {
for (int i = 0; i < 10; i++) {
}
Console.WriteLine("Before start thread");
}
}
public class MyClass {
public static void Main() {
Thread tid2 = new Thread(new ThreadStart(MyThread.Thread2 ) );
Thread tid1 = new Thread(new ThreadStart(MyThread.Thread1 ) );
tid1.Start();
tid2.Start();
}
}
خروجی این برنامه بصورت زیر است. یعنی هر دو تابع پشت سر هم اجرا شده اند:
Before start thread
Thread1 0
Thread1 1
Thread1 4
Thread1 2
Thread1 3
Thread1 5
Thread1 9
Thread1 6
Thread1 7
Thread1 8
Thread2 0
Thread2 5
Thread2 1
Thread2 2
Thread2 3
Thread2 4
Thread2 6
Thread2 9
Thread2 7
Thread2 8
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Console.WriteLine("Thread1 {0}", i);
}
}
public class MyClass {
public void Thread2() {
for (int i = 0; i < 10; i++) {
Console.WriteLine("Thread2 {0}", i);
}
public static void Main() {
Thread tid2 = new Thread(new ThreadStart(thr.Thread2) );
Console.WriteLine("Before start thread");
MyThread thr = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr.Thread1) );
tid1.Start();
tid2.Start();
}
}
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Console.WriteLine("Hello world {0}", i);
}
}
}
public class MyClass {
public static void Main() {
MyThread thr2 = new MyThread();
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
tid1.Start();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid2.Start();
}
}
در برنامه زیر تابع نوشته شده برای نخ بعد از چاپ یک خروجی به مدت یک میلی ثانیه توقف می کند ، در این فاصله پردازنده به نخ دیگر داده شده و یک خروجی برای او چاپ می کند. به عبارتی پردازنده دائماً بین نخ ها دست به دست می شود.
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Console.WriteLine("Hello world " + i);
Thread.Sleep(1);
}
}
}
public class MyClass {
MyThread thr1 = new MyThread();
public static void Main() {
Console.WriteLine("Before start thread");
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
tid1.Start();
tid2.Start();
}
}
خروجی حاصل از این برنامه بصورت زیر است:
Before start thread
Hello world 0
Hello world 1
Hello world 0
Hello world 1
Hello world 3
Hello world 2
Hello world 2
Hello world 3
Hello world 5
Hello world 4
Hello world 4
Hello world 5
Hello world 6
Hello world 8
Hello world 6
Hello world 7
Hello world 7
Hello world 8
Hello world 9
Hello world 9