基本的な http バインディングを使用して、自己ホスト型の WCF サービスを使用しています。WCF によって公開された関数にアクセスする wcf サービスへの呼び出しは、(wcf サービスから) 関数を直接使用する場合よりも (内部的に) 完了するのにはるかに長い時間がかかることがわかりました。
明確にするために、私はwcf呼び出しを「オーバー」することについて話しているのではありません。WCF の背後にある内部公開関数が実行されると、それらは独自の処理で、クライアントに送信するために作業を行い、wcf サービスに何かを返すのに、同じ関数に直接アクセスする場合よりもはるかに長い時間がかかります。ホストされている wcf アプリのフォーム。
すべての機能について広範なロギング、ロギングの開始時間と停止時間を追加しましたが、一貫しているようです。WCF を介してアクティブ化された場合、同じ関数は、WCF インターフェイスをバイパスして呼び出す場合よりもはるかに低い「優先度」で実行されているように見えます。
これを考慮に入れると、メインの wcf クラスを次のように装飾した後、UI スレッドがロックされたため、これが頭を突き出し始めたと確信しています。
<ServiceBehavior(useSynchronizationContext:=False)>
上記の装飾のために作成されたスレッドは、より低い優先度で実行されていますか?
WCF がホストするアプリのフォームからの直接呼び出し: 5 秒
WCF インターフェイスを介した呼び出し: 20 ~ 30 秒 (ネットワーク経由の時間を除く)
内部機能が完了すると、WCF サービス自体からの物理的な復帰は非常に迅速です。
内部機能に到達すると、かなり多くの「作業」を行います。
何か案は?
ありがとう
基本的な WCF サービス コード:
Dim myservicehost As ServiceHost
Dim myServiceAddress As New Uri("http://" & LocalIpAddress & ":" & tcp_port & "/" & servicename)
myservicehost = New ServiceHost(GetType(myWCFFunctions), myServiceAddress)
' Enable metadata publishing.
Dim smb As New ServiceMetadataBehavior()
smb.HttpGetEnabled = True
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
myservicehost.Description.Behaviors.Add(smb)
myservicehost.Open()