Ich habe eine C# 2.0-Anwendung mit einem Formular, das eine Klasse verwendet, die einen Thread enthält.Invoke/BeginInvoke aus einem Thread aufrufen
In der Thread-Funktion, anstatt den Event-Handler direkt aufzurufen, wird es aufgerufen. Dies hat zur Folge, dass das besitzende Formular InvokeRequired/BeginInvoke nicht aufrufen muss, um seine Steuerelemente zu aktualisieren.
public class Foo
{
private Control owner_;
Thread thread_;
public event EventHandler<EventArgs> FooEvent;
public Foo(Control owner)
{
owner_ = owner;
thread_ = new Thread(FooThread);
thread_.Start();
}
private void FooThread()
{
Thread.Sleep(1000);
for (;;)
{
// Invoke performed in the thread
owner_.Invoke((EventHandler<EventArgs>)InternalFooEvent,
new object[] { this, new EventArgs() });
Thread.Sleep(10);
}
}
private void InternalFooEvent(object sender, EventArgs e)
{
EventHandler<EventArgs> evt = FooEvent;
if (evt != null)
evt(sender, e);
}
}
public partial class Form1 : Form
{
private Foo foo_;
public Form1()
{
InitializeComponent();
foo_ = new Foo(this);
foo_.FooEvent += OnFooEvent;
}
private void OnFooEvent(object sender, EventArgs e)
{
// does not need to call InvokeRequired/BeginInvoke()
label_.Text = "hello";
}
}
Dies ist offensichtlich im Gegensatz zu dem von Microsoft APIs verwendet, die Hintergrund-Threads wie System.Timers.Timer und System.IO.Ports.SerialPort verwenden. Gibt es irgendetwas an sich falsch mit dieser Methode? Ist es in irgendeiner Weise gefährlich?
Danke, PaulH
Edit: auch, was passiert, wenn die Form der Veranstaltung abonnieren nicht sofort? Würde es die Nachrichtenwarteschlange des Formulars mit Ereignissen verstopfen, an denen das Formular nicht interessiert war?
siehe bitte editieren – Falcon