.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);
ඔබ .NET 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
දේපළ හා වටිනාකම පසු කිරීම වැනි මෝඩ දේවල් කිරීමෙන් කිසිවෙකු වළක්වන්නේ නැත , එබැවින් පහත සඳහන් දෑ සතුටින් සම්පාදනය කරනු ඇත:
myLabel.SetPropertyThreadSafe(() => aForm.ShowIcon, false);
එනිසා සම්මත කළ දේපල ඇත්ත වශයෙන්ම Control
ක්රමයට කැඳවනු ලබන ක්රමයට අයත් බව සහතික කිරීම සඳහා මම ධාවන කාල චෙක්පත් එක් කළෙමි . පරිපූර්ණ නොවේ, නමුත් .NET 2.0 අනුවාදයට වඩා බොහෝ හොඳය.
සම්පාදක කාල ආරක්ෂාව සඳහා මෙම කේතය වැඩි දියුණු කරන්නේ කෙසේද යන්න පිළිබඳව යමෙකුට තවත් යෝජනා තිබේ නම්, කරුණාකර අදහස් දක්වන්න!