Bonjour,

J'ai créé un control qui hérite de TextBox et qui contient un FileSystemWatcher afin d'afficher le contenu d'un fichier lors de modification de celui-ci:

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
public class myControl : TextBox
{
    private FileSystemWatcher m_FileWatcher = new FileSystemWatcher();
 
    protected override void OnInitialized(EventArgs e)
    {
            base.OnInitialized(e);
 
            m_FileWatcher.EnableRaisingEvents = true;
 
            m_FileWatcher.NotifyFilter   = NotifyFilters.LastAccess;
            m_FileWatcher.Changed     += new FileSystemEventHandler(m_FileWatcher_Changed);
    }
 
    void m_FileWatcher_Changed(object sender, FileSystemEventArgs e)
    {
        // Ouverture du fichier en lecture
        FileStream myStream = ...
        StreamReader myReader = ...
 
        // Je met à jour le texte de la TextBox
        this.Text = reader.ReadToEnd();
 
        myStream.Dispose();
        myReader .Dispose();            
    }
}
J'obtient alors l'erreur suivante lors de l'accès à this.Text :
"Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire."

J'ai résolu le problème en utilisant le dispatcher de l'application principale:
App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(FileWatcher_Changed), e);

Cependant, j'aurai aimé créé un control indépendant de l'application, et donc, ne pas utiliser App.

J'ai pensé à implémenter ISynchronizeInvoke et à renseigner le file watcher
Code : Sélectionner tout - Visualiser dans une fenêtre à part
m_FileWatcher.SynchronizingObject = this;
mais je ne sais pas comment implémenter le BeginInvoke.

Merci d'avance pour vos remarques et suggestions,
AL2000