我有一个调度多个任务的应用程序,这些任务调用不同的web服务,有些是相同的web服务,但方法不同。每个任务都在一个间隔内执行,并且每个任务都在其自己的线程中运行。为了获得对webservice的引用,我有一个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;
}
有人知道我为什么会有这种行为吗?
编辑:
以下是在我将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
发布于 2011-05-13 20:20:19
这可能与WCF服务上的concurrency/instancing settings有关。
如果所有的调用都去往相同的服务实例(例如InstanceContextMode = PerSession or Single
),那么通常需要确保将ConcurrencyMode
设置为Multiple
,否则调用将以序列化的方式提供服务。
你能告诉我们更多关于WCF服务(而不是客户端)是如何设置的吗?
https://stackoverflow.com/questions/5990469
复制相似问题