我有一个应用程序调度多个任务,这些任务调用不同的 Web 服务,其中一些是相同的 Web 服务,但方法不同。每个任务都以一定的间隔执行,并且每个任务都在自己的线程中运行。为了获取对 Web 服务的引用,我有一个 wsdl.exe 生成的代理类,该代理类在每个任务中实例化并始终进行处理。然而,在运行应用程序时,任务实际上在服务请求时相互等待,Web 服务在完成处理来自任务 x 的请求之前不会处理来自任务 y 的服务请求(我可以看到这一点,因为来自任务 x 的服务调用可能需要5 分钟,任务 y 100 毫秒,但是如果 y 在 x 运行时启动,则它在 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;
}
有谁知道我为什么会遇到这种行为?
EDIT:
以下是我将 [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