よろしくお願いします。並行性、インスタンス化、スレッド セーフに関する記事をいくつか読みましたが、まだ疑問があることを告白します。実際、記事の情報は矛盾していることもあります。
日付期間 (StartDate と EndDate) を受け取る単純な WFC サービスがあります。サービスは、StartDate と EndDate で定義された期間内に名前に日付を含むファイルを検索する必要があります。作成されたファイルは圧縮され、サーバーにアップロードされます。
多くのテストを行った結果、サービスの動作に問題があることに気づきませんでした。ただし、本番環境でサービスを使用する前に、クライアントからの複数の同時リクエストが他のリクエストのデータ整合性に影響を与えないようにするために、サービス コードが安全であることを確認する必要があります。
コード スニペットを投稿し、コードにコメント/質問を追加しました。
サービス Instancing を PerCall に設定したことに注意してください。マイクロソフトのドキュメントで気づいたように、「PerCall インスタンス化では、各メッセージが新しいサービス インスタンスによって処理されるため、同時実行性は関係ありません。」しかし、各サービスインスタンスはそれ自体でスレッドセーフですか? つまり、サービスへの各クライアント呼び出しは、他の呼び出しのデータを変更できませんか?
キング よろしく。J.カンポス
' - - - - - - - - - - - - - - - WFC Service Contract - - - - - - - - - - - - - - -
<ServiceContract()>
Public Interface IMyReports
<OperationContract(IsOneWay:=True)>
Sub SvcRequest(ByVal ClientID as integer, ByVal startDate as string, ByVal EndDate)
End Interface
' - - - - - - - - - - - - - - - WFC Service - - - - - - - - - - - - - - -
<ServiceBehavior(InstanceContextMode:=InstanceContextMode.PerCall)>
Public Class SvcDoRequest
Implements IMyReports
'??? These Private members can be changed by another Service Call?
Private Dat1 as string=""
Private Dat2 as string=""
Private SearchFolder as string=""
Public Sub SvcRequest(StartDate as string, EndDate as String) Implements IMyReports.SvcRequest
SearchFolder= "c:\SearchFolder\"
Dat1 as string=StarDate
Dat2 as string=EndDate
Dim ListOfFiles as new List(of String)
'Recursive File Search
'??? Arguments passed byRef. Can the Arguments be Changed by another Service Call?
Call FGetFiles(SearchFolder, ListOfFiles)
Dim Result as integer=0
If ListOfFiles.Count>0
Dim ZipFileName as string="c:\MyZipFile.Zip"
Dim ErrMsg as string=""
' External Library to Create a ZIP File containing ListOfFiles()
'??? ErrMsg is passed byRef in order to return a possible error message.
'??? Can ErrMsg be Changed by another Service Call?
Dim ClZip As New MyZipLibrary.ZipClass
If ClZip.FCreateZip(ListOfFiles, ZipFileName, ErrMsg)=False Then
Call WriteToLog(ErrMsg)
Result=-1
Else
Result=1
End if
End if
' Upload ZipFile
'
End Sub
Private Function FGetFiles(ByRef Folder As String, ByRef LFiles As List(Of String)) as boolean
'??? is this recursive function safe? Byref args Folder,LFiles can be changed by another Call?
For Each File1 As String In Directory.GetFiles(Folder)
Dim FileInfo1 As New FileInfo(File1)
Dim FileDate As String = FileInfo1.Name.Substring(0,8)
If FileDate >= Dat1 And FileDate <= Dat2 Then
LFiles.Add(FileInfo1.FullName)
End If
Next
For Each Dir1 As String In Directory.GetDirectories(Folder)
Call FGetFiles(Dir1, LFiles)
Next
Return True
End Function
End Class
'- - - - - - - - - - - - - - - - - - - - - - - - - ZIP Library - - - - - - - - - - -
Public Class MyZipLibrary
Public Function FCreateZip(byval ListOfFiles as List(of String),
Byval ZipFileName as string, ByRef ErrMsg as string) as Boolean
If Not CreateZipFile()
'Byref Argument ErrMsg. can be changed by another client Call?
ErrMsg="Unable To Create ZipFile"
Return false
Else
Return True
End if
End function
End Class