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:
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
m_FileWatcher.SynchronizingObject = this;
mais je ne sais pas comment implémenter le BeginInvoke.
Merci d'avance pour vos remarques et suggestions,
AL2000
Partager