Bonjour à tous,

Dans une class perso j'ai crée une tâche asynchrone qui à un moment donné doit remonté un événement pour mettre à jour mon formulaire.

Hors je me retrouve avec une exception d'opération inter-thread.

Tout les codes exemples que j'ai trouvé sur le net utilisent toujours la méthode : or celle-ci n'est pas disponible dans ma class.

Comment puis-je procéder ?

Merci par avance !

Ma class :

FileWatch : procédure qui lance le thread
Processthreading : Le thread
OnPropertyChanged : remonte l'événement

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
 
Imports System.IO
Imports System.ComponentModel
Imports System.Threading
 
 
Public Class CatiaFileWatcher
    Inherits System.Windows.Forms.BaseCollection
    Implements INotifyPropertyChanged
    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
 
    Private _FullFileName As String = Nothing
    Private WithEvents _Version As String = Nothing
    Private WithEvents _Release As String = Nothing
    Private WithEvents _Hotfix As String = Nothing
 
    Const _TextFilter As String = "LastSaveVersion"
    Private _TempFileName As String = My.Computer.FileSystem.SpecialDirectories.Temp + "\CatiaWatcherOut.txt"
    Private MyProcess As New Process
 
    Public ReadOnly Property Hotfix() As String
        Get
            Return _Hotfix
        End Get
    End Property
 
    Public ReadOnly Property Release() As String
        Get
            Return _Release
        End Get
    End Property
 
    Public ReadOnly Property Version() As String
        Get
            Return _Version
        End Get
    End Property
 
    Public Property FullFileName() As String
        Get
            Return _FullFileName
        End Get
        Set(ByVal value As String)
            _FullFileName = value
        End Set
    End Property
 
    Public Sub FileWatch()
 
        Dim StartInfo As New ProcessStartInfo
 
        Try
            My.Computer.FileSystem.DeleteFile(_TempFileName)
        Catch ErrNotFound As FileNotFoundException
 
        Catch ErrElse As Exception
            MsgBox(ErrElse.Message)
            Exit Sub
 
        End Try
 
        With StartInfo
            .WindowStyle = ProcessWindowStyle.Hidden
            .UseShellExecute = False
            .RedirectStandardOutput = True
            .FileName = "cmd.exe"
            .Arguments = "/C findstr /c:" + Chr(34) + _TextFilter + Chr(34) + " " + FullFileName '+ " > " + _TempFileName
        End With
        MyProcess.StartInfo = StartInfo
 
        Dim ThreadProcess As New Thread(AddressOf ProcessThreading)
 
        ThreadProcess.Start()
 
 
    End Sub
 
    Private Sub ProcessThreading() 'Process As Process, TempfileName As String)
 
        MyProcess.Start()
        MyProcess.WaitForExit()
 
        Dim ReadValues As String = Nothing
 
        Using Sr As StreamReader = MyProcess.StandardOutput 'New StreamReader(_TempFileName, System.Text.Encoding.ASCII)
            Do While Sr.EndOfStream = False
                ReadValues = String.Concat(ReadValues, ChrW(Sr.Read))
            Loop
        End Using
 
        _Version = ReadParameters(ReadValues, _TextFilter, "<Version>")
        OnPropertyChanged("Version")
        _Release = ReadParameters(ReadValues, _TextFilter, "<Release>")
        OnPropertyChanged("Release")
        _Hotfix = ReadParameters(ReadValues, _TextFilter, "<HotFix>")
        OnPropertyChanged("Hotfix")
 
 
    End Sub
 
 
    Function ReadParameters(ByVal TextToRead As String, ByVal StartString As String, ByVal ParametreName As String) As String
 
        Dim Start As Integer = TextToRead.IndexOf(StartString)
        Dim StartBalise As Integer = TextToRead.IndexOf(ParametreName, Start)
        Dim LengthBalise As Integer = ParametreName.Length
        Dim EndBalise As Integer = TextToRead.IndexOf("/" + ParametreName, Start)
 
        Try
            Return TextToRead.Substring(StartBalise + LengthBalise, EndBalise - (StartBalise + LengthBalise))
        Catch
            Return "Not able to read " + ParametreName + " value."
        End Try
 
 
    End Function
 
    Protected Sub OnPropertyChanged(ByVal name As String)
 
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name))
    End Sub
 
 
End Class