Bonjour,

Dans mon code j'utilise une API qui permet d'accéder à un lecteur de carte sans contact.

Cette API permet de récupérer des traces qu'elle remonte à travers une fonction de callback.

Ci-dessous, la fonction que j'appelle qui me permet de configurer l'API en lui indiquant la fonction de callback à laquelle elle peut accéder:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
Public Sub APIConfigLogHook()
	'Configuration de la routine de callback
	Dim APICallBackpfHook As New ApiLogCallback(AddressOf Me.APICallBackFunc)
	ApiReturn = sCscSetApiLogHookEx(APICallBackpfHook)
	If ApiReturn <> 0 Then
		DisplayError(ApiReturn) 
	Else
 
	End If
End Sub
la fonction de callback en elle meme, qui sera donc appelé par l'API (si je comprend bien comment cela fonctionne ?) , dans laquelle je vais écrire dans un fichier le log retourné par l'API:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
Private Sub ThalesAPICallBackFunc (byval pText As String)
 
Dim filename As String = Application.StartupPath & "\api.log"
Dim sw As StreamWriter = File.AppendText(filename)
sw.WriteLine(Now() & " | " & pText)
sw.Close()
 
End Sub
Mon problème est que lorsque j’exécute le code pas à pas , le fichier de log (api.log) est renseigné sans erreur, mais dés que j'execute mon code en mode normal, j'ai le droit à l'erreur suivante, comme s'il y avait tellement de log à écrire que lors de l'écriture du log suivant, le fichier n'était pas encore fermé lors de l'écriture précédente. C'est la conclusion que je me fais car personne d'autres et à aucun autre endroit dans mon code je n'accède à ce fichier de log, et pourtant dans l'erreur on peut voir : <<Le processus ne peut pas accéder au fichier ..api.log', car il est en cours d'utilisation par un autre processus.>>

De plus je me demandais si dans ce genre de cas, il ne serait pas mieux d'écrire de manière asynchrone dans le fichier de log (meme si je ne sais pas trop comment faire), ou peut être que je me fais de fausses idées, mais je me disais que lorsque mon programme écris dans le fichier de log, du coup il ne fait rien d'autres et du coup il ne peut pas gérer ce qu'il se passe au niveau du lecteur de carte (par exemple la detection d'une carte, salecture, etc..)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
System.IO.IOException: Le processus ne peut pas accéder au fichier '...\api.log', car il est en cours d'utilisation par un autre processus.
   à System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   à System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   à System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   à System.IO.StreamWriter.CreateFile(String path, Boolean append, Boolean checkHost)
   à System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost)
   à System.IO.StreamWriter..ctor(String path, Boolean append)
   à System.IO.File.AppendText(String path)
   à CardDetection.CscApi.APICallBackFunc(String pText) dans D:\SHARPEDEVELOP\CardDetection\CardDetection\CscApi\CscApi.vb:ligne 132