مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

abolfazl_d_sh

عضویت از 1393/04/31

مشکل برنامه با خطای System.InvalidOperationException

  • جمعه 28 شهریور 1393
  • 14:58
تشکر میکنم

سلام

من برای کار با استریم برنامه ای نوشتم ولی وقتی میخام یه فایل رو باز کنم با این ارور مواجه میشم:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
Additional information: Cross-thread operation not valid: Control 'tbResults' accessed from a thread other than the thread it was created on

این هم کدی هست که نوشتم:

 private void btnSync_Click(object sender, EventArgs e)
        {
            Thread thdSyncRead = new Thread(new ThreadStart(syncRead));
            thdSyncRead.SetApartmentState(ApartmentState.STA);
            thdSyncRead.Start();
        }

        public void syncRead()
        {
            openFileDialog.ShowDialog();
            FileStream fs;
            try
            {
                fs = new FileStream(openFileDialog.FileName, FileMode.OpenOrCreate);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
            fs.Seek(0, SeekOrigin.Begin);
            fileContents = new byte[fs.Length];
            fs.Read(fileContents, 0, (int)fs.Length);
            tbResults.Text = Encoding.UTF8.GetString(fileContents);
            fs.Close();
        }

ممنون میشم راهنماییم کنید.

پاسخ های این پرسش

تعداد پاسخ ها : 3 پاسخ
کاربر سایت

پوریا غلامی

عضویت از 1393/05/25

  • جمعه 28 شهریور 1393
  • 21:07

سلام به شما

زمانی که شما از thread استفاده می کنید باید توجه کنید که برای کار کردن با کنترل های صفحه (UI) کمی محدود هستید و به همین خواطر یه سری کدهای اضافه تر نوشت

طبق کد های شما  tbResults یک کنترل محسوب میشه  لذا من کدهای شمارو اصلاح کردم :

درون فرمتون کدهای زیر رو اضافه کنید

    

    delegate void SetTextCallback(string text);

        private void SetText(string text)
        {
            if (this.tbResults.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.tbResults.Text = text;
            }
        }

به جای این کد :

tbResults.Text = Encoding.UTF8.GetString(fileContents);

خط مقابل رو قرار بدید

SetText(Encoding.UTF8.GetString(fileContents));

 

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

 

کاربر سایت

abolfazl_d_sh

عضویت از 1393/04/31

  • جمعه 28 شهریور 1393
  • 23:57

ممنون آقای غلامی....درست شد.

فقط ممنون میشم اگه یه توضیح مختصر بدید که این کد ها چیکار میکنه.

ممنون

کاربر سایت

پوریا غلامی

عضویت از 1393/05/25

  • یکشنبه 30 شهریور 1393
  • 22:42
کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)