در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

مهرناز معروف

non-blocking در C#

درود

وقت بخیر

من یک برنامه باید تا سه چهار روز آینده بنویسم که non-blocking باشد. یا یک فایل سرور non-blocking ، که عملکردش شبیه به چند نخی است اما در یک نخ انجام میشود . و برنامه parallelism است .

من به زبان سی شارپ این تیکه کد رو نوشتم که اجرا کنه و ارور نده، اما مشکلی که دارم اینه که ایا این non-blocking میشه؟ برنامه رو سرچ کردم گفته شده که از memorybarrier استفاده بشه و با توجه به کتابی که دارم این قطعه کد بود :

کد non-blocking موجود در کتاب

که من در برنامه خودم به این شکل نوشتمش که main داشته باشه و اجرا بشه. اما فکر کنم دو نخی شده !

ممکنه راهنماییم کنین چطوری باید main رو به برنامه اضافه کنم که به صورت non-blocking بشه و چند نخی نشود.

برنامه ای که خودم نوشتم :

برنامه ای که خودم نوشتم

ممنون از راهنمایی شما

این سوال 3 پاسخ دارد.
لذت یادگیری با توسینسو
به عنوان شخصی که مدت هاست از سایت توسینسو استفاده می کنم باید بگم که واقعاً یکی از بهترین مرجع ها برای ارتقاء دانش شخصی هست. دوره های سایت، راهکارها و مطالب، همگی عالی هستند.
مهرناز معروف

البته complate و answer رو هم نفهمیدم توی برنامه چه کاری میکنن؟! :|

MrnzMruf
جواد طوسی

اگه کمی بیشتر در مورد برنامت توضیح بدی که دقیقا چکار میخای انجام بدی میشه راهنماییت کرد!!!

من فقط چندتا حلقه میبینم مشکلت کجاست! کدوم خط خطا میده!!!

مهرناز معروف

خطا نمیده .

دو تا تابع رو میبینین؟ استفاده از memorybarrie هست. که توی شکل اول نوشته شده .

برنامه ی non-blocking باید بنویسم . این تیکه کد اولی که هست برای non-blocking به کار می رود .

من اومدم براش main گذاشتم اما به نظر چون دو تا تابع رو فراخوانی کردم مثل اینکه دو نخی شده! یعنی خیلی شبیه به برنامه ی چند نخی هست بیشتر تا به برنامه ی non-blocking شباهت داشته باشد . برای همین میخواستم بدونم چطور باید void main بذارم برای برنامم که صحیح و non-blocking اجرا شود؟

MrnzMruf
جواد طوسی
        public static DemoProg()
        {

        }  

این میشه void main شما

مهرناز معروف

main مگه نباید داشته باشه یک برنامه؟

و داخل main نباید توابع فراخوانی بشن؟

خب همون به چه شکل میشه؟

که چند نخی نشه و non blocking باشه؟

MrnzMruf
مهرناز معروف

شما بگین یک برنامه بخوام بنویسم به صورت non-blocking، چی باید بنویسم؟

MrnzMruf
علی  ورزشی

دوست عزیز این که میگید چند نخی نشه و Non-blocking باشه یعنی چی ؟ اصلا یه همیچین سوالی رو کجا پیدا کردید ؟ چون این بحث یک بخشی از معماری برای زبان برنامه نویسی هستش که یا استفاده کنن یا استفاده نکنند . به نظر من سوال اشتباه هستش چون وقتی یه زبان به صورت Blocking طراحی شده جه ظور می تونید برنامه های Non-nlocking برای اون بنویسید ؟ اصلا این ها به کنار . برای پیاده سازی همچین چیزی باید به منابع سخت افزاری دسترسی داشته باشی تا بتونی درخواست ها و پاسخ ها رو کنترل کنی .

جهانی که در ان زندگی می کنیم بدل نامرغوب ان چیزی است که باید باشد

دوست عزیز برای این که یک قسمت از برنامه به صورت non-blocking کار کنه باید اونو به شکل async پیاده سازی بکنی. که در این صورت برنامه ات بدون این که منتظر باشه کارهای دیگه ای هم انجام میده و به شکلی بلاک نمی شه که منتظر رخ دادن یک اتفاق باشه برای یادگیری این قسمت در C# به این لینک مراجعه کنید asynchronous programming

سرنوشت ما با افکارمان تغییر می کند؛ اگر افکارمان همیشه مطابق با خواسته هایمان باشند، همان چیزی می شویم که آرزو داریم و همان کاری را می کنیم که می خواهیم
  • انتخاب شده به عنوان جواب توسط 1 نفر
جواد طوسی

منظورتون از non-blocking دقیقا چیه؟ تا بحال نشنیدم؟؟؟

مهرناز معروف

روش های ایجاد سرویس دهنده سه روش هست :

1. مدل چند نخی : Threads : که به صورت اجرا موازی است و به صورت Blocking system calls

2. مدل فرایند های تک نخی : Single-threaded process : که هم بلاکینگ اند و هم موازی اجرا نمی شوند.

3. Finite-State machine : FSM : که هم به صورت موازی هست و هم به صورت نان بلاکینگ .

به این روش سوم میگن برنامه ها به صورت نان بلاکینگه .

بر اساس Event ها کار می کنه که برنامه نویسیش هم سخته برای همین پروژه ای که به ما دادن فقط گفتن یک فایل سرور و یا یک برنامه خودتون بنویسین که نان بلاکینگ باشه . نمیخاد برنامه بزرگ بنویسین

MrnzMruf
مهرناز معروف

درود آقای مهدی عادلی این لینکی که گذاشتین رو مطالعه کردم . برنامه اش رو دانلود کردم متوجه نمیشم چیکار کرده ؟!

MrnzMruf
جواد طوسی

دوست عزیز من موضوع نخ رو در همه جا به عنوان همزمانی یا موازی شنیده بودم!

خوب مشکلت رو فهمیدم!

شما برنامتون کنسول هست!

اول چرا از BackgroundWorker استفاده نمی کنی؟

ثانیا اگه واقعا نمیتونی می تونی کد thread رو بشکل زیر اجرا کن؟

        static void Main()
        {
           Thread t = new Thread(new ThreadStart(A));
            t.Start();
        }
  • انتخاب شده به عنوان جواب توسط 1 نفر
مهرناز معروف

خب اینطور باشه یک قطعه کد هم برای B باید بنویسم .

این فرقش با چند نخی چی میشه؟

و اینکه الان برنامه ای که خودم نوشتم Complate و answer کار خاصی به نظر انجام نمیدن!!! در اجرا !! نباشن هم اجرا میشه و همین نتیجه رو میده که الان میده!!

و همچنین از Event ها استفاده نشده است ..

MrnzMruf
جواد طوسی

دوست گلم

جواب سوال Complate و answer چه فایده ای داره!

خیلی خیلی خلاصه بگم چون مطلب در این موضوع بسیار زیاد است!

مشکل از جایی آغاز میشه که پردازنده های چندهسته ای جایگزین تک هسته ای شد در بسیاری از نرم افزارهایی که روی پردازنده single core قابل اجرا بودند برای اینکه بتونن بصورت multi-core پیاده سازی بشن عملا یک مشکل جدی وجود داشت! در واقع می شد فرض کرد که برنامه بدون طی سیر تکامل به مرحله تکامل برسه!!!! این مشکل توسط ماکروسافت حل شد که با استفاده از یک سد برای مانع و انحراف از مسیر تکامل برنامه و اختلال در روند اون جلوگیری بکنه! متد memorybarrier یکی از همین روش ها بود که بعد از این موضوع بشدت توصیه شد!

و همچنین در دستور شما استفاده از answer و در نهایت Complate میتونه چرخه برنامه رو کاملا گارانتی بکنه که برنامه داره سیر تکاملیشو به شکل درست انجام میده!!

بر محمد و آل محمد صلوات

مهرناز معروف

الان برنامه ای که نوشتم درسته از نظر نان بلاکینگ بودن؟؟

در توابع a و b اگر for و if را نذارم هم یک خروجی مشابه با الان می دهد ! برای همین سوال برام پیش اومد که دلیلش چیست و مشکل من کجاست؟

فردا یعنی 6 مرداد تحویل پروژه حضوری دارم و باید بتونم توضیح بدم برنامه رو در حالی که نمیدونم باید بگم complate و answer چی کاره اند اینجا؟ و مسلما باید فرقی داشته باشد با زمانی که در برنامه نیستن یا هستن !

ممنون از شما

MrnzMruf
مهرناز معروف

الان وسط برنامه داده شده answer=123

خب این کجا خودشو نشون میده؟؟

برنامه من درسته؟

MrnzMruf
جواد طوسی

سلام دوست عزیز

من چیزی از پروژه شما نمیدونم اما این قطعه کد من میتونه توصیف خوبی برای 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();
}
  • انتخاب شده به عنوان جواب توسط 1 نفر
پاسخ شما
برای ارسال پاسخ خود وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....