異なる Web サービスを呼び出す複数のタスクをスケジュールするアプリケーションがあります。いくつかは同じ Web サービスですが、異なるメソッドです。各タスクは一定の間隔で実行され、各タスクは独自のスレッドで実行されます。Web サービスへの参照を取得するために、各タスク内でインスタンス化され、常に破棄される wsdl.exe 生成プロキシ クラスがあります。ただし、アプリケーションを実行している場合、タスクは実際にはサービス要求で互いに待機しています。Web サービスは、タスク x からの要求を処理する前に、タスク y からのサービス要求を処理しません (タスク x からのサービス呼び出しに時間がかかる場合があるため、これを見ることができます)。 5 分、タスク y は 100 ミリ秒ですが、x の実行中に y が開始されている場合は、x が完了してから 100 ミリ秒後に終了します)。
これはタスクのコードです (独自のスレッド内で実行されます):
public class TaskX : TaskWrapper
{
public TaskX(Guid id, string name, EventQueue eventqueue)
: base(id, name, eventqueue)
{
}
protected override void DoTask()
{
try
{
var factory = new ServiceReferenceFactory();
using (var reference = factory.GetServiceReference())
{
bool result;
bool isSpecified;
reference.Run(out result, out isSpecified);
}
}
}
}
これは、上記のファクトリ メソッドのコードです。
public ProxyClassService GetServiceReference()
{
var refer = new ProxyClassServiceNamespace.ProxyClassService();
refer.Timeout = 1000 * 60 * 60;
return refer;
}
なぜ私がこの行動を経験しているのか誰にも分かりますか?
編集:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] を wcf サービスの実装に追加した後のタスクのログを次に示します。Visual Studio 2008 で作成された wcf サービスの構成を変更しませんでした。
15:02 - タスク開始: TaskXWithInternalException
15:02 - タスク開始: TaskYQuickOne
15:02 - タスク終了: TaskYQuickOne タスク経過時間: 00:00:00.1214762
15:02 - タスク開始: TaskZSlowOne
15:03 - タスク開始: TaskXWithInternalException
15:03 - タスク開始: TaskYQuickOne
15:05 - タスク終了: TaskZSlowOne タスク経過時間: 00:03:11.6510947
15:05 - タスク終了: TaskYQuickOne タスク経過時間: 00:02:09.7311905
15:06 - タスク開始: TaskYQuickOne
15:06 - タスク終了: TaskYQuickOne タスク経過時間: 00:00:00.0546980