آموزش نکات #C قسمت سوم

آموزش نکات #C قسمت سوم

کار با کنترل های توليد شده توسط یک Thread از طریق Threadی دیگر

فرض کنيم یک تابع داریم که کاری بر روی یک Label انجام مي‌دهد. مي‌خواهيم این تابع را با استفاده از یک Thread دیگر فراخوانی کنيم .دقت کنيد که Label توسط thread اصلی برنامه ایجاد شده و نمي‌توان بصورت عادی به آن دسترسی داشت و با cross-thread exception مواجه مي‌شویم. برای این کار طبق روش زیر مي‌توان عمل کرد:

using System.Threading;

threadی که برای تابع مورد نظر تعریف مي‌کنيم:

Thread t = new Thread(new ThreadStart(this.DoSomeThing));

برای تعریف تابع مورد نظر باید به نکات زیر توجه داشته باشيم: زمانی که کنترل مورد نظر ما در اینجا label دارای مقدار true برای خاصيت InvokeRequired باشد ما باید تابع خود را بصورت cross-thread فراخوانی کنيم. برای اینکار از متد Invoke استفاده مي‌کنيم که یک Delegate به عنوان پارامتر مي‌گيرد و آنرا بصورت cross-thread فراخوانی مي‌کند. زمانيکه کنترل مورد نظر دارای مقدار false برای خاصيت InvokeRequired خود باشد مي‌توانيم کارهای مورد نظرمان را بر روی آن انجام دهيم. پس ما باید در ابتدا delegateی به متد مورد نظرمان تعریف کنيم و با استفاده از آن و به شکل زیر متد خود را تعریف مي‌کنيم:

void DoSomeThing() { if(label.InvokeRequired) { delegate void myDelegate(); myDelegate del = new myDelegate(this.DoSomeThing); Invokde(del); } else //something to do on label here }

کار با اشياء بوسيله ی نام آنها

مثال - نمایش یک فرم با دانستن نام آن: این مثال کاربردهای زیادی مي‌تواند داشته باشد، فرض کنيد که نام فرم های مورد نياز برای کاربردی خاص را در یک جدول دیتابيس ذخيره کرده‌اید

using System.Reflection; private void button1_Click(object sender, EventArgs e) { Assembly myAssembly = Assembly.GetExecutingAssembly(); Form myForm = myAssembly.CreateInstance("WindowsFormsApplication1.Form2") as Form; myForm.ShowDialog(); }

نکته : حتما نام NameSpace را قبل از نام آبجکت قرار دهيد؛ در مثال بالا "WindowsFormsApplication1" بود.

جلوگيری از رخ دادن Unhandled Exceptions

در فایل program.cs مربوط به پروژه بعد از دستورات زیر

Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false);

دستور زیر را قرار بدهید

Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);

و در همان فایل program.cs متدی با همان نامی که در سازنده بالا دادید باید ایجاد کنيد مثل متد زیر

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { MessageBox.Show(" ;("خطا در اجرای دستور کاربر", "خطا }

از این به بعد در صورتی که خطایی در قطعه کدی از برنامه رخ بدهد که درون بلاک try قرار نداشته باشد به این متد فرستاده می‌شود و دیگه پيام پيش فرض دات نت فریم ورک نمایش داده نمی‌شود. نکته : آرگومان e در متد فوق حاوی Exception ایجاد شده می‌باشد که از آن می‌توان استفاده‌های مختلفی کرد.



نظرات کاربران



عبارت امنیتی : حاصل 7 × 5 می شود :
متن پیام :