Clipboard Watching & Apartment State

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

public partial class Form1 : Form
{
     public Form1()
    {
        Thread t =  new Thread(new ThreadStart(clipboardWatcher));         t.Start();
    }
    public void clipboardWatcher()
    {
        while (true)
            string text = Clipboard.GetText();
    }
}

علت این مشکل این است که طبق آنچه در اینجا گفته شده است، کلاس Clipboard باید در یک ترد از نوع STA مورد استفاده قرار بگیرد. چراکه کلاس کلیپ برد از COM استفاده می کند و این محدودیت نیز از همینجا نشعت میگیرد.
اما در اینجا هم گفته شده که تردهای ساخته شده به طور پیش فرض از نوع MTA هستند.  مگر صریحا نوع آن تعیین شود. 
اگر تا به حال متوجه این مشکل نشده اید به این دلیل است که نقطه ورود برنامه های دات نتی به طور پیش فرض بوسیله STAThreadAttribute  به نوع STA تبدیل می شود. اما برای ترد جدید که می سازید باید این کار صریحا صورت گیرد.
پس پیش ار فراخوانی متد Start ترد، نوع آن را اینگونه تنطمیم می کنیم:
t.SetApartmentState(ApartmentState.STA);
اما نکته جالب آخر اینکه هرچند در مستندات مایکروسافت  در مورد متدهای کلاس Clipboard در مورد استثنای  ThreadStateException صحبت شده و گفته شده در صورت STA نبودن تردی که فراخوانی در آن انجام می شود،این استثنا روی می دهد ولی این استثنا برای من هیچ گاه روی نداد!