J'ai une application C# 2.0 avec un formulaire qui utilise une classe qui contient un thread.Appel Invoke/BeginInvoke à partir d'un thread
Dans la fonction de thread, plutôt que d'appeler le gestionnaire d'événements directement, il est appelé. L'effet est que le formulaire propriétaire n'a pas besoin d'appeler InvokeRequired/BeginInvoke pour mettre à jour ses contrôles.
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";
}
}
Ceci est évidemment contraire à la méthode utilisée par les API de Microsoft qui utilisent les threads de fond comme System.Timers.Timer et System.IO.Ports.SerialPort. Y at-il quelque chose de fondamentalement faux avec cette méthode? Est-ce dangereux d'une certaine façon?
Merci, PaulH
Edit: aussi, si la forme n'a pas souscrit à l'événement tout de suite? Souhaitez-vous obstruer la file d'attente des messages du formulaire avec des événements qui ne l'intéressaient pas?
s'il vous plaît voir mon modifier – Falcon