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

نام تاپیک: مشکل با background worker

  1. #1
    کاربر دائمی
    تاریخ عضویت
    اردیبهشت 1391
    محل زندگی
    root
    سن
    28
    پست
    1,098

    مشکل با background worker

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

    listbox1.listindex = x


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

    ممنون

  2. #2
    کاربر دائمی
    تاریخ عضویت
    اردیبهشت 1391
    محل زندگی
    root
    سن
    28
    پست
    1,098

    نقل قول: مشکل با background worker

    آقا کسی جواب مارو نمیده ؟

  3. #3

    نقل قول: مشکل با background worker

    باید از Delegate استفاده کنید.

  4. #4
    کاربر دائمی آواتار فرید نجفلو
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    تبریز
    پست
    1,189

    نقل قول: مشکل با background worker

    احتمالا شما با مشکل IllegalCrossThread مواجه می شید
    راحت رین را اینه که جای داخل فرم مثلا تو لود بنویسید:
    CheckForIllegalCrossThreadCalls = false; 


    راه دیگه ای هم اصولی تر هست Invoke کردن دستوراته ولی فکر نکنم به خاطر پیچیدگیش خوشتون بیاد

  5. #5
    کاربر دائمی
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    تهران-غرب-شهران....
    پست
    146

    نقل قول: مشکل با background worker

    نقل قول نوشته شده توسط فرید نجفلو مشاهده تاپیک
    احتمالا شما با مشکل IllegalCrossThread مواجه می شید
    راحت رین را اینه که جای داخل فرم مثلا تو لود بنویسید:
    CheckForIllegalCrossThreadCalls = false; 


    راه دیگه ای هم اصولی تر هست Invoke کردن دستوراته ولی فکر نکنم به خاطر پیچیدگیش خوشتون بیاد
    این بدترین کاری هست که می شه انجام داد و برنامه رو در حالت بن بست که شاید هیچوقت نتونی دلیلش رو پیدا کنی قرار می ده.

  6. #6
    کاربر دائمی
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    تهران-غرب-شهران....
    پست
    146

    نقل قول: مشکل با background worker

    در مورد Cross Thrrading بحث زیاد شده یه سرچ تو همین سایت کنی مطالب خوبی پیدا می کنی
    برای حل مشکلت باید از Invoke استفاده کنی

  7. #7
    کاربر دائمی
    تاریخ عضویت
    اردیبهشت 1391
    محل زندگی
    root
    سن
    28
    پست
    1,098

    نقل قول: مشکل با background worker

    میشه چندتا تاپیک شما معرفی کنین . چون تا حالا با background w کار نکردم

    ممنومنننننممنمنمنمن

  8. #8

    نقل قول: مشکل با background worker

    سلام
    اول خاصیت WorkerReportProgress رو برابر true قرار میدی تا بتونی در حال اجرای background عملیاتی رو انجام بدی
    خب فرض کن thread شما در طول برنامه اجا میشه در این حالت شما دستوراتی رو که شرایط بررسی میکنن و تصمیم گیری انجام میده رو در رویداد DoWork مینویسی
    به نتیجه دلخواهت که رسیدی( از همونجا نمیتونی به اشیا thread اصلی برنامه دسترسی داشته باشی) ، با استفاده از متد ReportProgress)( یک عدد رو به عنوان ReportProgress پاس میدی که اونو میتونی از رویداد ProgressChanged بخونی و عملیات مورد نظرتو همونجا انجام بدی. خب تا اینجا کارتو تا حدی راه میندازه چیز خاصی نداره یکم باهاش کار کنی یاد میگیری ی نمونه هم برات میذارم(صرفا جهت اشنایی :D)



    private void Form1_Load(object sender, EventArgs e)
    {
    bgw.WorkerReportsProgress = true;
    bgw.RunWorkerAsync();
    }

    private void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
    for (int i = 1; i <= 10; i++)
    {
    object obj = "Counter:" + i;
    Thread.Sleep(600);
    bgw.ReportProgress(i * 10, obj);
    }
    }

    private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    progressBar1.Value = e.ProgressPercentage;
    this.Text = e.UserState as string;
    }


    اینجا در متد ReportProgress ی عدد و یک شی ارسال میکنم و در رویداد ProgressChanged اونارو میگیرم و دیگه هر کاری دوز داری انجام بده :P
    ی نکته : اگه BackGround شما قرار نیست تا پایان برنامه ادامه پیدا کنه ینی کارش تموم میشه شما میتونی از رویداد RunWorkerComplete هم استفاده کنی
    موفق باشی

  9. #9
    کاربر دائمی آواتار فرید نجفلو
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    تبریز
    پست
    1,189

    نقل قول: مشکل با background worker

    کدی که دوستمون mousa1992 دادن کاملا بیانگر نحوه کنترل نخ ها نیست
    چون طبق اون کد شما کار ها رو به جز در اون رویداد bgw_ProgressChanged انجام بدید و مهمترین نکته یعنی Invoke هم ذکر نشده

    یک فرم جدید به همراه دو دکمه ، یک لیست باکس و یک بک گراند ورکر ایجاد کنید
    کد ها رو به شکل زیر بنویسید:
    (بعد از کلیک هر یک از دکمه ها سعی کنید با فرم بازی کنید مثلا فرم رو جا به جا کنید یا آیتم های لیست رو انتخاب کنید)



    private void button1_Click(object sender, EventArgs e)
    {
    listBox1.Items.Clear();
    backgroundWorker1.RunWorkerAsync();
    }

    private void button2_Click(object sender, EventArgs e)
    {
    listBox1.Items.Clear();
    CreateList();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
    CreateList();
    }

    private void CreateList()
    {
    for (int i = 1; i <= 20; i++)
    {
    System.Threading.Thread.Sleep(1000);//کدی جهت مختل کرد کار نخ جاری
    if (this.InvokeRequired)
    this.Invoke((Action<string>)AddItem, i.ToString());
    else
    AddItem(i.ToString());
    }
    }

    private void AddItem(string Item)
    {
    listBox1.Items.Add(Item);
    }



    نتیجه:
    دکمه اول به راحتی و بدون ایجاد مزاحمت به گرافیک و پاسخ گویی فرم کار می کنه اما دکمه دوم ...!

    ---------------
    نکات:
    سعی کنید هیچ وقت کار ها رو داخل روال رویداد ها ننویسید ، اون ها رو به متد ها و توابع بشکنید

    خط this.InvokeRequired :
    این خط بررسی میکنه که اگه نخ جاری چیزی غیر از نخ اصلی فرم (که توانایی کار با کنترل ها رو داره) باشه متد مورد نظر رو داخل نخ فرم اجرا می کنه در غیر این صورت به حالت عادی استفاده میشه

    توجه کنید که با زدن دکمه اول عملا ما دو نخ (نخ اصلی یا نخ فرم و نخ بک گراند ورکر) خواهیم داشت اما نکته اینجاست که متد AddItem در هر صورت (دکمه اول یا دوم) در داخل نخ فرم اجرا میشه

    حالت جالب1:
    خط مربوط به Sleep رو به داخل متد AddItem انتقال بدید در این حالت چیزی که مشاهده میشه حالتی بین تک نخی و چند نخی هست
    نه به اندازه چند نخی روان کار میکنه و نه به اندازه تک نخی عدم پاسخ گویی داره (البته هیچ تضمینی وجود نداره که پاسخ گویی در سطح بالا یا پایین بمونه)
    پس نوشتن کدها در جای مناسب حین برنامه نویسی چند نخی از اهمیت ویژه ای بر خورداره

    حالت جالب2:
    با همون کد اولیه بعد یا قبل از خط Sleep این خط رو هم اضافه کنید:

                    Application.DoEvents();


    عمل کرد دکمه دوم جالب خواهد بود

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

  1. مبتدی: مشکل در کار با BackGround Worker
    نوشته شده توسط Sir-Programmer در بخش C#‎‎
    پاسخ: 4
    آخرین پست: جمعه 01 دی 1391, 18:55 عصر
  2. background worker
    نوشته شده توسط HAIdle در بخش C#‎‎
    پاسخ: 14
    آخرین پست: یک شنبه 23 اسفند 1388, 19:12 عصر
  3. نحوه کار با Background worker
    نوشته شده توسط محمد زارع در بخش VB.NET
    پاسخ: 1
    آخرین پست: یک شنبه 07 مهر 1387, 15:35 عصر
  4. سوال: Background Worker
    نوشته شده توسط mc_laren در بخش VB.NET
    پاسخ: 2
    آخرین پست: جمعه 14 تیر 1387, 18:44 عصر
  5. کار با background worker در VB.net 2005
    نوشته شده توسط محمد زارع در بخش VB.NET
    پاسخ: 3
    آخرین پست: دوشنبه 15 مرداد 1386, 16:39 عصر

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

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