نمایش نتایج 1 تا 3 از 3

نام تاپیک: دلیل استفاده از Invoke برای نمایش متن در TextBox چیه؟

  1. #1
    کاربر دائمی آواتار mmbguide
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    منظومه شمسی
    پست
    1,170

    دلیل استفاده از Invoke برای نمایش متن در TextBox چیه؟

    سلام

    در یک برنامه آموزش سوکت نویسی پس از دریافت اطلاعات از کلاینت، پیغام دریافت شده بصورت زیر نمایش داده میشه. می‌خواستم اگر امکان داره توضیح بدید چرا از Invoke استفاده شده و مستقیم متن را نمایش نداده؟


    printline("Client discnnected at : " + DateTime.Now.ToString());


    public void printline(string _strPrint)
    {
    this.tbConsoleOutput.Invoke(new Action<string>(doInvoke), _strPrint);
    }


    public void doInvoke(string _strPrint)
    {
    this.tbConsoleOutput.Text = _strPrint + Environment.NewLine + tbConsoleOutput.Text;
    }


    تشکر

  2. #2

    نقل قول: دلیل استفاده از Invoke برای نمایش متن در TextBox چیه؟

    نقل قول نوشته شده توسط mmbguide مشاهده تاپیک
    سلام

    در یک برنامه آموزش سوکت نویسی پس از دریافت اطلاعات از کلاینت، پیغام دریافت شده بصورت زیر نمایش داده میشه. می‌خواستم اگر امکان داره توضیح بدید چرا از Invoke استفاده شده و مستقیم متن را نمایش نداده؟


    printline("Client discnnected at : " + DateTime.Now.ToString());


    public void printline(string _strPrint)
    {
    this.tbConsoleOutput.Invoke(new Action<string>(doInvoke), _strPrint);
    }


    public void doInvoke(string _strPrint)
    {
    this.tbConsoleOutput.Text = _strPrint + Environment.NewLine + tbConsoleOutput.Text;
    }


    تشکر
    خلاصه اش اینه که اجرای printline نتیجه یک رخداد ئه که مستقل از نخ اصلی فرم رخ داده، در نخ دیگری است. برای همین printline توسط نخ (Thread) ای اجرا میشه که امکان تغییر مقدار tbConsoleOutput.Text رو نداره. پس میاد با Invoke از نخ مدیریت کننده اون tbConsoleOutput درخواست می کنه که لطفا از طرف من doInvoke رو اجرا کن، یعنی خودش doInvoke رو اجرا نمی کنه، از نخ دیگری که اجازه تغییر مقدار tbConsoleOutput.Text رو داره درخواست می کنه که doInvoke رو اجرا کنه.

    در کد نویسی و طراحی کمپوننت های برنامه نویسی یک ویژگی مثبت هست به نام Thread Safety به این معنا که کدی که Thread Safe باشه میتونه بدون نگرانی بابت تداخل توسط نخ (Thread) های متفاوت مورد استفاده قرار بگیره، حتی همزمان. مثلا چند نخ بتوانند همزمان در یک لیست آیتم اضافه و کم کنند، بدون اینکه نگران تداخل این روال ها باشند.
    که این ویژگی برای استفاده در کد نویسی Multi-Thread خیلی مفید ئه.

    اما کنترل های ویندوز مثل اون TextBox ویژگی Thread Safety ندارند، Thread Safe نیستند، از اساس برای دسترسی در چندین نخ مناسب نیستند.
    Thread Safe نبودن کنترل های ویندوز به این معنا است که برای دسترسی در هیچ نخی جز اون نخ که TextBox رو ایجاد کرده و مدیریت می کنه آمادگی ندارند.
    البته ممکنه بشه بعضی موارد مثل خواندن مقدار برخی مشخصه های کنترل رو در سایر نخ ها انجام داد، اما اون مقادیر از کلاس NET. اون کنترل خونده میشن که فیلد ها و مشخصه های عادی در محیط NET. هستند، به خود کنترل ویندوز که با API سیستم عامل ایجاد و مدیریت میشه تعلق ندارند.

    وقتی شما اون tbConsoleOutput رو در فرمی نمایش می دهید، همون نخ که فرم رو مدیریت می کنه، تنها نخی است که اجازه داره متن tbConsoleOutput.Text رو تغییر بده.
    سایر نخ ها مستقیما نباید روی اون tbConsoleOutput کاری انجام بدهند، باید با Invoke از نخ مدیریت اون TextBox درخواست کنند که لطفا از طرف من فلان روال رو در نخ خودت انجام بده.
    اون متد printline در نخ ای بجز اون نخ که فرم رو مدیریت می کنه اجرا میشه، چون ارتباط سوکت توسط نخ دیگری بجز نخ اصلی فرم مدیریت میشه. یعنی نخ ای نیست که اجازه دسترسی به tbConsoleOutput رو داشته باشه.
    پس میاد با Invoke از اون نخ اصلی فرم درخواست اجرا شدن doInvoke رو می کنه، doInvoke توسط نخ اصلی برنامه اجرا میشه و برای همین مشکلی برای دسترسی به tbConsoleOutput و تغییر مقدار Text اش نداره.

  3. #3
    کاربر دائمی آواتار mmbguide
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    منظومه شمسی
    پست
    1,170

    نقل قول: دلیل استفاده از Invoke برای نمایش متن در TextBox چیه؟

    سلام

    ممنون از راهنمایی خوبتون

تاپیک های مشابه

  1. کار متود Invoke چیست و چگونه باید استفاده کرد
    نوشته شده توسط HAMRAHSOFT.IR در بخش C#‎‎
    پاسخ: 5
    آخرین پست: یک شنبه 18 بهمن 1394, 14:43 عصر
  2. متد های invoke و dispose چه هستند؟
    نوشته شده توسط jd.mn98 در بخش C#‎‎
    پاسخ: 2
    آخرین پست: پنج شنبه 23 مرداد 1393, 17:52 عصر
  3. مشکل در استفاده از invoke action
    نوشته شده توسط Sir-Programmer در بخش C#‎‎
    پاسخ: 5
    آخرین پست: یک شنبه 21 مهر 1392, 17:01 عصر
  4. دستورات invok و begin invoke و end invoke
    نوشته شده توسط خسرو خان در بخش C#‎‎
    پاسخ: 1
    آخرین پست: سه شنبه 21 شهریور 1391, 09:51 صبح
  5. سوال : نحوه استفاده از تابع Invoke در GridView
    نوشته شده توسط mehri_ema در بخش C#‎‎
    پاسخ: 1
    آخرین پست: شنبه 18 دی 1389, 21:47 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •