non-blocking در C#
درود
وقت بخیر
من یک برنامه باید تا سه چهار روز آینده بنویسم که non-blocking باشد. یا یک فایل سرور non-blocking ، که عملکردش شبیه به چند نخی است اما در یک نخ انجام میشود . و برنامه parallelism است .
من به زبان سی شارپ این تیکه کد رو نوشتم که اجرا کنه و ارور نده، اما مشکلی که دارم اینه که ایا این non-blocking میشه؟ برنامه رو سرچ کردم گفته شده که از memorybarrier استفاده بشه و با توجه به کتابی که دارم این قطعه کد بود :
که من در برنامه خودم به این شکل نوشتمش که main داشته باشه و اجرا بشه. اما فکر کنم دو نخی شده !
ممکنه راهنماییم کنین چطوری باید main رو به برنامه اضافه کنم که به صورت non-blocking بشه و چند نخی نشود.
برنامه ای که خودم نوشتم :
ممنون از راهنمایی شما
17 پاسخ
خطا نمیده .
دو تا تابع رو میبینین؟ استفاده از memorybarrie هست. که توی شکل اول نوشته شده .
برنامه ی non-blocking باید بنویسم . این تیکه کد اولی که هست برای non-blocking به کار می رود .
من اومدم براش main گذاشتم اما به نظر چون دو تا تابع رو فراخوانی کردم مثل اینکه دو نخی شده! یعنی خیلی شبیه به برنامه ی چند نخی هست بیشتر تا به برنامه ی non-blocking شباهت داشته باشد . برای همین میخواستم بدونم چطور باید void main بذارم برای برنامم که صحیح و non-blocking اجرا شود؟
درود آقای مهدی عادلی این لینکی که گذاشتین رو مطالعه کردم . برنامه اش رو دانلود کردم متوجه نمیشم چیکار کرده ؟!
روش های ایجاد سرویس دهنده سه روش هست :
1. مدل چند نخی : Threads : که به صورت اجرا موازی است و به صورت Blocking system calls
2. مدل فرایند های تک نخی : Single-threaded process : که هم بلاکینگ اند و هم موازی اجرا نمی شوند.
3. Finite-State machine : FSM : که هم به صورت موازی هست و هم به صورت نان بلاکینگ .
به این روش سوم میگن برنامه ها به صورت نان بلاکینگه .
بر اساس Event ها کار می کنه که برنامه نویسیش هم سخته برای همین پروژه ای که به ما دادن فقط گفتن یک فایل سرور و یا یک برنامه خودتون بنویسین که نان بلاکینگ باشه . نمیخاد برنامه بزرگ بنویسین
منظورتون از non-blocking دقیقا چیه؟ تا بحال نشنیدم؟؟؟
اگه کمی بیشتر در مورد برنامت توضیح بدی که دقیقا چکار میخای انجام بدی میشه راهنماییت کرد!!!
من فقط چندتا حلقه میبینم مشکلت کجاست! کدوم خط خطا میده!!!
دوست عزیز برای این که یک قسمت از برنامه به صورت non-blocking کار کنه باید اونو به شکل async پیاده سازی بکنی. که در این صورت برنامه ات بدون این که منتظر باشه کارهای دیگه ای هم انجام میده و به شکلی بلاک نمی شه که منتظر رخ دادن یک اتفاق باشه برای یادگیری این قسمت در C# به این لینک مراجعه کنید asynchronous programming
البته complate و answer رو هم نفهمیدم توی برنامه چه کاری میکنن؟! :|
دوست عزیز این که میگید چند نخی نشه و Non-blocking باشه یعنی چی ؟ اصلا یه همیچین سوالی رو کجا پیدا کردید ؟ چون این بحث یک بخشی از معماری برای زبان برنامه نویسی هستش که یا استفاده کنن یا استفاده نکنند . به نظر من سوال اشتباه هستش چون وقتی یه زبان به صورت Blocking طراحی شده جه ظور می تونید برنامه های Non-nlocking برای اون بنویسید ؟ اصلا این ها به کنار . برای پیاده سازی همچین چیزی باید به منابع سخت افزاری دسترسی داشته باشی تا بتونی درخواست ها و پاسخ ها رو کنترل کنی .
main مگه نباید داشته باشه یک برنامه؟
و داخل main نباید توابع فراخوانی بشن؟
خب همون به چه شکل میشه؟
که چند نخی نشه و non blocking باشه؟
دوست گلم
جواب سوال Complate و answer چه فایده ای داره!
خیلی خیلی خلاصه بگم چون مطلب در این موضوع بسیار زیاد است!
مشکل از جایی آغاز میشه که پردازنده های چندهسته ای جایگزین تک هسته ای شد در بسیاری از نرم افزارهایی که روی پردازنده single core قابل اجرا بودند برای اینکه بتونن بصورت multi-core پیاده سازی بشن عملا یک مشکل جدی وجود داشت! در واقع می شد فرض کرد که برنامه بدون طی سیر تکامل به مرحله تکامل برسه!!!! این مشکل توسط ماکروسافت حل شد که با استفاده از یک سد برای مانع و انحراف از مسیر تکامل برنامه و اختلال در روند اون جلوگیری بکنه! متد memorybarrier یکی از همین روش ها بود که بعد از این موضوع بشدت توصیه شد!
و همچنین در دستور شما استفاده از answer و در نهایت Complate میتونه چرخه برنامه رو کاملا گارانتی بکنه که برنامه داره سیر تکاملیشو به شکل درست انجام میده!!
بر محمد و آل محمد صلوات
الان وسط برنامه داده شده answer=123
خب این کجا خودشو نشون میده؟؟
برنامه من درسته؟
public static DemoProg()
{
}
این میشه void main شما
شما بگین یک برنامه بخوام بنویسم به صورت non-blocking، چی باید بنویسم؟
دوست عزیز من موضوع نخ رو در همه جا به عنوان همزمانی یا موازی شنیده بودم!
خوب مشکلت رو فهمیدم!
شما برنامتون کنسول هست!
اول چرا از BackgroundWorker استفاده نمی کنی؟
ثانیا اگه واقعا نمیتونی می تونی کد thread رو بشکل زیر اجرا کن؟
static void Main()
{
Thread t = new Thread(new ThreadStart(A));
t.Start();
}
سلام دوست عزیز
من چیزی از پروژه شما نمیدونم اما این قطعه کد من میتونه توصیف خوبی برای Non Blocking باشه!
using System.Threading; using System.Threading.Tasks;
CancellationTokenSource _cts;
volatile bool _run = true;
public void Start( )
{
_cts = new CancellationTokenSource();
var token = _cts.Token;
var t = Task.Factory.StartNew(() =>
{
Console.WriteLine("Start");
while (true)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Break");
break;
}
Console.WriteLine(".");
Thread.Sleep(1000);
}
}, token);
}
public void Cancel( )
{
Console.WriteLine("Cancel");
if( _cts != null )
_cts.Cancel();
}
void Main( )
{
Start( );
Console.ReadLine();
Cancel();
}
الان برنامه ای که نوشتم درسته از نظر نان بلاکینگ بودن؟؟
در توابع a و b اگر for و if را نذارم هم یک خروجی مشابه با الان می دهد ! برای همین سوال برام پیش اومد که دلیلش چیست و مشکل من کجاست؟
فردا یعنی 6 مرداد تحویل پروژه حضوری دارم و باید بتونم توضیح بدم برنامه رو در حالی که نمیدونم باید بگم complate و answer چی کاره اند اینجا؟ و مسلما باید فرقی داشته باشد با زمانی که در برنامه نیستن یا هستن !
ممنون از شما
خب اینطور باشه یک قطعه کد هم برای B باید بنویسم .
این فرقش با چند نخی چی میشه؟
و اینکه الان برنامه ای که خودم نوشتم Complate و answer کار خاصی به نظر انجام نمیدن!!! در اجرا !! نباشن هم اجرا میشه و همین نتیجه رو میده که الان میده!!
و همچنین از Event ها استفاده نشده است ..