インターフェイスとデリゲートを介して別のスレッドからラベルを更新しようとしています。デバッグ モードでは、ラベル プロパティがメッセージに設定されていると表示されます。しかし、フォーム自体には何も見えません。
.NET 4.0 での作業
私が使用しているものの小さな表現:
私のインターフェース:
public interface IMessageListener
{
void SetMessage(string message);
}
私がそれを実装するフォーム:
public partial class Form1 : Form, IMessageListener
{
...
public void SetMessage(string message)
{
SetControlPropertyValue(ColoLbl, "Text", message);
}
delegate void SetControlValueCallback(Control oControl, string propName, object propValue);
private void SetControlPropertyValue(Control oControl, string propName, object propValue)
{
if (oControl.InvokeRequired)
{
SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue);
oControl.Invoke(d, new object[] { oControl, propName, propValue });
}
else
{
Type t = oControl.GetType();
PropertyInfo[] props = t.GetProperties();
foreach (PropertyInfo p in props.Where(p => p.Name.ToUpper() == propName.ToUpper()))
{
p.SetValue(oControl, propValue, null);
}
}
}
}
インターフェイスを介してメッセージを設定しようとするクラス。このクラスは別のスレッドから実行されています:
public class Controller
{
IMessageListener iMessageListener = new Form1();
...
public void doWork()
{
iMessageListener.SetMessage("Show my message");
}
}
ラベルのプロパティをデバッグしてステップスルーすると、コードはすべて正常にコンパイルされますが、何らかの理由でフォーム自体に表示されません。
どこかで行が欠落しているか、Controller
クラスがインターフェイスを処理する方法が問題の原因であると思われます。しかし、私はその理由や正確な理由を理解できません。