سلام
من برای کار با استریم برنامه ای نوشتم ولی وقتی میخام یه فایل رو باز کنم با این ارور مواجه میشم:
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(); }
ممنون میشم راهنماییم کنید.
سلام به شما
زمانی که شما از 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));
امید وارم مشکلتون حل بشه
ممنون آقای غلامی....درست شد.
فقط ممنون میشم اگه یه توضیح مختصر بدید که این کد ها چیکار میکنه.
ممنون
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)