【发布时间】:2015-08-14 16:07:37
【问题描述】:
我阅读了很多关于 wcf 并发和实例上下文模式的文章,我也阅读了关于它的 CodeProject 文章,但仍然无法让它工作。
这是我的客户端代码(如果你问我为什么要使用实例上下文,那是因为我最终会测试回调,但我还没有,只是尝试同时多次执行简单的请求/响应)
public void Run()
{
InstanceContext context = new InstanceContext(this);
MyServiceReference.MyService service = new MyServiceReference.MyService(context);
for (int i = 0; i < 10; i++)
{
int j = i;
Thread t = new Thread(() => myFun((j + 1), service));
t.Start();
}
countdownEvent.Wait();
Console.ReadLine();
service.Close();
}
private void myFun(int threadNo, MyServiceReference.MyServiceClient service)
{
Console.WriteLine(service.GetData1(threadNo));
countdownEvent.Signal();
}
这是服务代码:
[ServiceContract(CallbackContract = typeof(IMyServiceCallback))]
public interface IMyService
{
[OperationContract]
string GetData1(int value);
}
public interface IMyServiceCallback
{
[OperationContract]
string GetData2(int value);
}
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext=false)]
public class MyService : IMyService
{
public string GetData1(int value)
{
reponse = DateTime.Now.ToString();
Thread.Sleep(5000);
return "Request: " + value + ", Thread id: " + Thread.CurrentThread.ManagedThreadId + ", response: " + reponse;
}
这是输出:
Request: 1, Thread id: 9, response: 2015-08-14 11:39:42
Request: 2, Thread id: 10, response: 2015-08-14 11:39:47
Request: 3, Thread id: 8, response: 2015-08-14 11:39:52
Request: 4, Thread id: 9, response: 2015-08-14 11:39:57
Request: 5, Thread id: 10, response: 2015-08-14 11:40:02
Request: 6, Thread id: 9, response: 2015-08-14 11:40:07
Request: 7, Thread id: 10, response: 2015-08-14 11:40:12
Request: 8, Thread id: 9, response: 2015-08-14 11:40:17
Request: 9, Thread id: 10, response: 2015-08-14 11:40:22
Request: 10, Thread id: 9, response: 2015-08-14 11:40:27
我希望将 ConcurrencyMode 设置为多个将使请求通过使用多个线程同时运行,但即使我看到使用了 3 个线程,操作仍然按顺序执行(每个响应之间 5 秒),我错过了什么?
我看到的每个示例都使用带有 void return 和 IsOneWay=True 的操作,这就是它对我不起作用的原因吗? 但是,我在客户端上为每个请求使用不同的线程,因此所有请求都应该同时完成,即使每个线程都在等待自己的响应。
我正在使用 WCF 服务主机和 NetTcpBinding 在调试中运行,在调试中运行会影响并发吗?
【问题讨论】:
-
我认为这可能是由于使用了相同的服务客户端。默认情况下会话是启用的,因此它可能只是按顺序执行它们作为同一会话的一部分。您可以尝试将 SessionMode.NotAllowed 放在您的服务行为上吗?
-
SessionMode 是在 ServiceContract 属性上而不是行为上,但无论如何我似乎无法关闭与 netTcpBinding 的会话。为什么同一个客户端会话无论如何都不能同时请求?
-
我尝试使用许多不同的客户端,它按预期工作(请求同时执行),但如果我想使用同一个客户端怎么办?不可能?
-
我创建了几乎完全相同的测试,结果相同!!添加
[ServiceBehavior(UseSynchronizationContext = false)]为我修复了它。
标签: c# multithreading wcf