Я работаю над созданием потокаобезопасного элемента управления для моего приложения Windows Forms.
Я понимаю, что могу установить текст в безопасном потоке управления, используя следующий код:
private delegate void SetTextD(Control control, string value);
private static void SetText(Control control, string value)
{
if(control.InvokeRequired)
{
control.Invoke(new SetTextD(SetText), new object[] {control, value});
}
else
{
control.Text = value;
}
}
Тогда в моем коде формы я могу позвонить:
SetText(lblStatus, "Updating...");
Моя цель - создать пользовательский элемент управления, который наследует Label. Затем внутри этого класса в свойстве Text я могу просто вызвать:
lblStatus.Text = "Обновление ..."
Тогда он автоматически сделает правильный потокобезопасный код.
Вот код, который я имею в своем классе:
public class ThreadSafeLabel : Label
{
private delegate string GetTextD();
private delegate void SetTextD(string value);
private string GetText()
{
if (InvokeRequired)
{
return (string)Invoke(new GetTextD(GetText));
}
return Text;
}
private void SetText(string value)
{
if(InvokeRequired)
{
Invoke(new SetTextD(SetText), new object[] {value});
}
else
{
Text = value;
}
}
public override string Text
{
get
{
return GetText();
}
set
{
SetText(value);
}
}
}
Теперь, когда я пытаюсь добавить этот элемент управления в мою форму, происходит сбой VS 2008. Я подумал, что, возможно, это связано с установкой исходного свойства текста при добавлении его в форму, но не уверен.
Есть мысли о том, что я могу делать неправильно или чего мне не хватает?
Если что-то не понятно, спросите.
Спасибо!