.NET 2.0 এর জন্য, আমি এখানে একটি দুর্দান্ত কোড লিখেছি যা আপনি যা চান ঠিক তা করে এবং একটিতে কোনও সম্পত্তির জন্য কাজ করে Control
:
private delegate void SetControlPropertyThreadSafeDelegate(
Control control,
string propertyName,
object propertyValue);
public static void SetControlPropertyThreadSafe(
Control control,
string propertyName,
object propertyValue)
{
if (control.InvokeRequired)
{
control.Invoke(new SetControlPropertyThreadSafeDelegate
(SetControlPropertyThreadSafe),
new object[] { control, propertyName, propertyValue });
}
else
{
control.GetType().InvokeMember(
propertyName,
BindingFlags.SetProperty,
null,
control,
new object[] { propertyValue });
}
}
এটিকে কল করুন:
// thread-safe equivalent of
// myLabel.Text = status;
SetControlPropertyThreadSafe(myLabel, "Text", status);
আপনি যদি নেট নেট 3.0.০ বা তার বেশি ব্যবহার করছেন তবে Control
ক্লাসের এক্সটেনশন পদ্ধতি হিসাবে আপনি উপরের পদ্ধতিটি পুনরায় লিখতে পারবেন , যা কলটি আরও সহজ করবে:
myLabel.SetPropertyThreadSafe("Text", status);
আপডেট 05/10/2010:
.NET 3.0 এর জন্য আপনার এই কোডটি ব্যবহার করা উচিত:
private delegate void SetPropertyThreadSafeDelegate<TResult>(
Control @this,
Expression<Func<TResult>> property,
TResult value);
public static void SetPropertyThreadSafe<TResult>(
this Control @this,
Expression<Func<TResult>> property,
TResult value)
{
var propertyInfo = (property.Body as MemberExpression).Member
as PropertyInfo;
if (propertyInfo == null ||
!@this.GetType().IsSubclassOf(propertyInfo.ReflectedType) ||
@this.GetType().GetProperty(
propertyInfo.Name,
propertyInfo.PropertyType) == null)
{
throw new ArgumentException("The lambda expression 'property' must reference a valid property on this Control.");
}
if (@this.InvokeRequired)
{
@this.Invoke(new SetPropertyThreadSafeDelegate<TResult>
(SetPropertyThreadSafe),
new object[] { @this, property, value });
}
else
{
@this.GetType().InvokeMember(
propertyInfo.Name,
BindingFlags.SetProperty,
null,
@this,
new object[] { value });
}
}
যা অনেক ক্লিনার, সহজ এবং নিরাপদ সিনট্যাক্সের জন্য লিনকুই এবং ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে:
myLabel.SetPropertyThreadSafe(() => myLabel.Text, status); // status has to be a string or this will fail to compile
সংকলনের সময় কেবলমাত্র সম্পত্তির নামটিই যাচাই করা হয় না, সম্পত্তির প্রকারটিও তাই, (উদাহরণস্বরূপ) বুলিয়ান সম্পত্তিতে একটি স্ট্রিং মান নির্ধারণ করা অসম্ভব এবং তাই একটি রানটাইম ব্যতিক্রম ঘটায়।
দুর্ভাগ্যক্রমে এটি অন্যের Control
সম্পত্তি এবং মূল্য পাসের মতো মূup় কাজগুলি থেকে কাউকে বাধা দেয় না , তাই নিম্নলিখিতগুলি সুখে সংকলন করবে:
myLabel.SetPropertyThreadSafe(() => aForm.ShowIcon, false);
অতএব আমি রানটাইম চেকগুলি যুক্ত করেছি তা নিশ্চিত করার জন্য যে পাস-ইন করা সম্পত্তিটি Control
পদ্ধতিটি যেভাবে আহ্বান করা হচ্ছে তার সাথে সম্পর্কিত। নিখুঁত নয়, তবে .NET 2.0 সংস্করণ থেকে অনেক বেশি ভাল।
সংকলন-সময় সুরক্ষার জন্য কারও কাছে এই কোডটি কীভাবে আরও উন্নত করা উচিত সে সম্পর্কে আরও কিছু পরামর্শ থাকলে দয়া করে মন্তব্য করুন!