مشخصات مقاله
-
2623
-
0.0
-
7188
-
0
-
1
آموزش چند نخی ASP.NET Multithreading
چند نخی / multithreading در ASP.NET
Thread عبارتند از مسیر اجرای یک برنامه. هر thread یک جریان کنترل منحصر بفرد را تعریف می کند.
چنانچه برنامه ای شامل چندین فرایند سنگین و زمان بر مانند دسترسی به پایگاه داده یا عملیات ورودی/خروجی انبوه و فشرده می باشد، در آن صورت انتخاب مسیرها یا نخ های (thread) مختلف اجرا بسیار سودمند خواهد بود، به گونه ای که هر نخ به انجام کار معینی بپردازد.
Thread ها، فرایندهای lightweight (در سیستمهای عامل به راه حل بینابینی از نخهای سطح کاربر و سطح هسته میگویند که الگوریتمی برای پیادهسازی سیستمهای چندکارگی است ولی در سیستمهای عامل تک پردازندهای و قدیمی مثل سولاریس و یونیکس سیستم وی به نخهای سطح کاربر، پروسه سبکوزن میگویند) هستند. نخ در واقع کوچترین توالی از دستورالعملهای برنامهریزی شده است که زمانبند سیستمعامل میتواند آنها را به شکل مستقل مدیریت کند.
یکی از کاربرد های امروزه ی نخ در پیاده سازی زمان بندی های همزمان است که توسط سیستم عامل های نوین و پیشرفته صورت می گیرد. استفاده از نخ ها از اتلاف چرخه یا cycle واحد پردازنده ی مرکزی (CPU Cycle) جلوگیری کرده و کارایی برنامه را بالا می برد.
تا به حال تنها برنامه هایی را کامپایل می کردیم که فقط یک نخ به عنوان یک فرایند اجرا می شد که همان نمونه ی در حال اجرای برنامه مورد نظر بود. از این طریق application تنها می تواند در یک بازه ی زمانی مشخص فقط یک کار را انجام دهد. برای ایجاد قابلیت اجرای چندین کار به طور همزمان، می توان برنامه را به نخ های کوچکتری تبدیل کرد.
در .NET نخ کشی (Threading) از طریق فضای نام (namespace) 'System.Threading' اداره می شود. تعریف یک متغیر از نوع System.Threading.Thread به شما امکان ایجاد نخ های جدید و مجزا و نیز دسترسی به آن ها در برنامه را می دهد.
ایجاد thread
این کار از طریق ایجاد یک شئ Thread و دادن یک ارجاع ThreadStart به سازنده ی (constructor) آن انجام می گیرد.
ThreadStart childthreat = new ThreadStart(childthreadcall);
Thread life cycle (چرخه ی حیات نخ)
چرخه ی حیات نخ از زمانی آغاز می شود که یک شئ از کلاس System.Threading.Thread ایجاد شده و هنگامی پایان می یابد که نخ اجرای خود را به اتمام برساند.
زیر وضعیت های مختلف چرخه ی حیات نخ را مشاهده می کنید:
- The Unstarted State: وضعیتی است که در آن نمونه (instance) نخ ایجاد شده ولی متد Start هنوز فراخوانی نشده است.
- Ready State: وضعیتی است که نخ در آن به طور کامل آماده ی اجرا بوده و فقط منتظر CPU Cycle می باشد.
- The Not Runnable State: نخ تحت شرایط زیر قابل اجرا نمی باشد:
- تابع Sleep فراخوانی شده باشد.
- تابع Wait صدا زده شده باشد.
- توسط عملیات ورودی/خروجی یا I/O مسدود (block) شده باشد.
- Dead State: وضعیتی است که نخ اجرای خود را به اتمام رسانده باشد یا به هر دلیلی ناگهان خاتمه (abort) داده شده باشد.
Thread Priority (سطح اولویت نخ ها)
خاصیت (property) Priority کلاس Thread، اولویت یک نخ را در رابط با نخ های دیگر سنجیده و تعیین می کند. .Net runtime، ready thread (نخ آماده ی اجرا) را به عنوان نخ دارای بالاترین سطح اولویت در نظر گرفته و انتخاب می کند:
سطح اولویت نخ ها را می توان به ترتیب زیر رده بندی کرد:
- Above normal
- Below normal
- Highest
- Lowest
- Normal
یک نخ به مجرد اینکه ایجاد می گردد، سطح اولویت آن با استفاده از خاصیت Priority کلاس Thread تعیین می شود:
NewThread.Priority = ThreadPriority.Highest;
خاصیت ها و توابع thread
Property های کلاس thread به ترتیب با ذکر شرح برای شما فهرست شده:
Principal: موجودتی که توسط سیستم کامپیوتر یا شبکه (برای اهداف و مقاصد امنیتی) اعتبار سنجی می شود.
این خاصیت مقداری برگردانده یا تنظیم می کند که آن مقدار مشخص می کند آیا thread مورد نظراز نوع پس زمینه است یا خیر.
کلاس thread دارای توابعی می باشد که زیر فهرست شده است:
صدا زدن این متد همان طور که از اسم آن پیدا است باعث اتمام یافتن نخ می شود.
باعث می شود نخ به تعداد دفعاتی که توسط پارامتر تکرار تعریف شده منتظر بماند.
مثال:
مثال زیر کاربرد و نحوه ی استفاده از کلاس Thread را نمایش می دهد. صفحه ی مورد نظر دارای یک کنترل label برای نشان دادن پیغام های child thread می باشد. پیام های ارسال شده از برنامه ی اصلی با استفاده از متد Response.Write() به طور مستقیم در کنترل مذکور (بالای صفحه) نمایش داده می شوند.
Source file:
< %@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="threaddemo._Default" % >
< %@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="multithreading.WebForm1" % >
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns="http://www.w3.org/1999/xhtml" >
< head runat="server" >
< title >
Untitled Page
< /title >
< /head >
< body >
< form id="form1" runat="server" >
< div >
< h3 >Thread Example< /h3 >
< /div >
< asp:Label ID="lblmessage" runat="server" Text="Label" >
< /asp:Label >
< /form >
< /body >
< /html >
Code behind file:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Threading;
namespace multithreading
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ThreadStart childthreat = new ThreadStart(childthreadcall);
Response.Write("Child Thread Started < br/ >");
Thread child = new Thread(childthreat);
child.Start();
Response.Write("Main sleeping for 2 seconds.......< br/ >");
Thread.Sleep(2000);
Response.Write("< br/ >Main aborting child thread< br/ >");
child.Abort();
}
public void childthreadcall()
{
try
{
lblmessage.Text = "< br / >Child thread started < br/ >";
lblmessage.Text += "Child Thread: Coiunting to 10";
for (int i = 0; i < 10; i++)
{
Thread.Sleep(500);
lblmessage.Text += "< br/ > in Child thread < /br >";
}
lblmessage.Text += "< br/ > child thread finished";
}
catch (ThreadAbortException e)
{
lblmessage.Text += "< br / > child thread - exception";
}
finally
{
lblmessage.Text += "< br / > child thread - unable to catch the exception";
}
}
}
}
به نکات زیر توجه داشته باشید:
هنگامی که صفحه بارگذاری می شود به دنبال آن یک thread جدید با ارجاع (reference) متد ()childthreadcall راه اندازی می شود. فعالیت های thread (thread activity) اصلی مسقیم روی صفحه نمایش داده می شوند.