[ThreadStatic]
ThreadLocal<T>
জেনেরিক ব্যবহারের সময় অ্যাট্রিবিউট ব্যবহার করে সংজ্ঞায়িত করা হয় । কেন বিভিন্ন ডিজাইনের সমাধানগুলি বেছে নেওয়া হয়েছিল? এক্ষেত্রে জেনেরিক ওভার অ্যাট্রিবিউট ব্যবহারের সুবিধা এবং অসুবিধাগুলি কী?
[ThreadStatic]
ThreadLocal<T>
জেনেরিক ব্যবহারের সময় অ্যাট্রিবিউট ব্যবহার করে সংজ্ঞায়িত করা হয় । কেন বিভিন্ন ডিজাইনের সমাধানগুলি বেছে নেওয়া হয়েছিল? এক্ষেত্রে জেনেরিক ওভার অ্যাট্রিবিউট ব্যবহারের সুবিধা এবং অসুবিধাগুলি কী?
উত্তর:
মন্তব্যগুলিতে ব্লগ পোস্টে উল্লিখিত কিছু স্পষ্ট করে না, তবে আমি খুব গুরুত্বপূর্ণ বলে মনে করি যে [ThreadStatic]
এটি প্রতিটি থ্রেডের জন্য স্বয়ংক্রিয়ভাবে জিনিসগুলিকে আরম্ভ করে না। উদাহরণস্বরূপ, বলুন আপনার কাছে এটি রয়েছে:
[ThreadStatic]
private static int Foo = 42;
এটির প্রথম থ্রেডটি Foo
আরম্ভ করা দেখতে পাবে 42
। তবে পরবর্তী থ্রেডগুলি হবে না। ইনিশিয়ালাইজার কেবল প্রথম থ্রেডের জন্য কাজ করে। সুতরাং কোডটি শুরু হয়ে আছে কিনা তা পরীক্ষা করার জন্য আপনাকে শেষ করতে হবে।
ThreadLocal<T>
আইটেমটি প্রথমবার অ্যাক্সেস করার আগে চালানো আপনাকে একটি আরম্ভকরণ ফাংশন সরবরাহ করার অনুমতি দেয় (যেমন রিডের ব্লগ শো করে) run
আমার মতে, এর [ThreadStatic]
পরিবর্তে ব্যবহার করার কোনও সুবিধা নেই ThreadLocal<T>
।
ThreadLocal<T>
.NET 4 এবং তার পাওয়া যায়, এবং অ্যাট্রিবিউট এছাড়াও 3.5 এবং নীচের পাওয়া যায়। ThreadStatic
ThreadLocal<T>
কার্যকরী IDisposable
এবং সাধারণত বাহিনী আপনি বাস্তবায়ন IDisposable
পাশাপাশি, যা আপনার কলারের বাধ্য করে আপনি মীমাংসা করা এবং সেইজন্য বাস্তবায়ন IDisposable
পাশাপাশি ...
ThreadLocal
বা তার ThreadStatic
সাথে খুব সতর্কতা অবলম্বন করব । এই মানগুলি পুল থ্রেডের পুরো জীবন জুড়ে থাকবে, কেবল আপনি যে কাজটি অর্পণ করেছেন তা নয়। এটি আপনাকে বেশ কিছু অপ্রত্যাশিত উপায়ে সমস্যার কারণ হতে পারে। দেখুন stackoverflow.com/questions/561518/... আরও তথ্যের জন্য এবং অনুরূপ প্রশ্ন।
static
? দেখুন msdn.microsoft.com/en-us/library/...
থ্রেডস্ট্যাটিক কেবল প্রথম থ্রেডে সূচনা করুন, প্রতিটি থ্রেডের জন্য থ্রেডলোকাল সূচনা করুন। নীচে সাধারণ বিক্ষোভ প্রদর্শন করা হচ্ছে:
public static ThreadLocal<int> _threadlocal =
new ThreadLocal<int>(() =>
{
return Thread.CurrentThread.ManagedThreadId;
});
public static void Main()
{
new Thread(() =>
{
for (int x = 0; x < _threadlocal.Value; x++)
{
Console.WriteLine("First Thread: {0}", x);
}
}).Start();
new Thread(() =>
{
for (int x = 0; x < _threadlocal.Value; x++)
{
Console.WriteLine("Second Thread: {0}", x);
}
}).Start();
Console.ReadKey();
}
থ্রেডস্ট্যাটিকের পিছনে মূল ধারণাটি প্রতিটি থ্রেডের জন্য ভেরিয়েবলের পৃথক অনুলিপি বজায় রাখা ।
class Program
{
[ThreadStatic]
static int value = 10;
static void Main(string[] args)
{
value = 25;
Task t1 = Task.Run(() =>
{
value++;
Console.WriteLine("T1: " + value);
});
Task t2 = Task.Run(() =>
{
value++;
Console.WriteLine("T2: " + value);
});
Task t3 = Task.Run(() =>
{
value++;
Console.WriteLine("T3: " + value);
});
Console.WriteLine("Main Thread : " + value);
Task.WaitAll(t1, t2, t3);
Console.ReadKey();
}
}
উপরের স্নিপেটে, value
প্রতিটি থ্রেডের মূল থ্রেড সহ আমাদের আলাদা আলাদা কপি রয়েছে।
সুতরাং, থ্রেডস্ট্যাটিক ভেরিয়েবলটি থ্রেডটি তৈরি করা থ্রেড বাদে অন্য থ্রেডগুলিতে তার ডিফল্ট মানতে শুরু করা হবে।
আমরা যদি প্রতিটি নিজস্ব থ্রেডে ভেরিয়েবলটি শুরু করতে চাই তবে থ্রেডলোকাল ব্যবহার করুন।