Bonsoir,
Je suis actuellement en train de développer une nouvelle aplication dans laquelle je mets en place un système de connexion à une base de donnée par l'intermédiaire d'Asynchronous Delegates (pas envie d'utiliser la classe Thread ni le BackgroundWorker).

Mon FLogin (boîte de dialogue de connexion):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
        public delegate void LoginSuccessfulEventHandler(LoginSuccessfulEventArgs e);
        public event LoginSuccessfulEventHandler LoginSuccessful;
 
        private delegate SqlConnectionReport ConnectionDelegate(string uid, string pwd,
            string sqlserver, string dbname);
 
        private void ButtonLogin_Click(object sender, EventArgs e)
        {
            this.Enabled = false;
 
            string uid = this.TextBoxUsername.Text;
            string pwd = this.TextBoxPassword.Text;
            string sqlserver = this.TextBoxSqlServer.Text;
            string dbname = this.TextBoxDbName.Text;
 
            ConnectionDelegate Connection = new ConnectionDelegate(SqlHelper.Connection);
            Connection.BeginInvoke(uid, pwd, sqlserver, dbname, new AsyncCallback(ConnectionCallback), Connection);
        }
 
        private void ConnectionCallback(IAsyncResult AsyncResult)
        {
            ConnectionDelegate Connection = (ConnectionDelegate)AsyncResult.AsyncState;
            SqlConnectionReport SqlConnReport = Connection.EndInvoke(AsyncResult);
 
            if (SqlConnReport.ConnectionSuccessful == true)
            {
                LoginSuccessful(new LoginSuccessfulEventArgs(null));
            }
            else
            {
                LoginSuccessful(new LoginSuccessfulEventArgs(SqlConnReport.Message));
            }
        }
LoginSuccessful s'exécute sur mon Form1, mais le problème n'est pas là.

Une fois que la connexion est effectue (SqlConnReport.ConnectionSuccessful à true), ma boite de dialogue est censée disparaître (avec un Hide()).

J'éxécute donc sur ma Form1 (qui a reçu le signal LoginSuccessful) un InvokeRequired pour savoir si oui ou non le code s'éxécute sur le Thread principal ou non.

InvokeRequired renvoi true, donc je suis censé utilisé la méthode Invoke() pour effectuer mon Hide(). Toutefois, j'ai testé le code sans cet Invoke() et il fonctionne sans Exceptions, ni quoi que ce soit d'autre. Or, je pensais que l'on ne pouvait accèder à un composant crée par un Thread qu'à partir de ce Thread en personne, or ce n'est pas le cas. Á moins que je me sois trompé...

En vous remerciant d'avance,

Nadd