我要在这里实现的目标是通过WCF服务“在行为完成后通知我”。
所以,我的程序:
using System;
using System.ServiceModel.Description;
namespace WaitEventTest {
static class Program {
public static void Main(params string[] args) {
var host = new Woof.ServiceEx.Wcf.WebServiceHost<WebService>(new Uri("http://localhost/test"));
var stb = new ServiceThrottlingBehavior {
MaxConcurrentCalls = 65535,
MaxConcurrentInstances = 65535,
MaxConcurrentSessions = 65535
};
var dsb = new DispatcherSynchronizationBehavior {
AsynchronousSendEnabled = true,
MaxPendingReceives = 65535
};
host.Description.Behaviors.Add(stb);
host.Description.Endpoints[0].EndpointBehaviors.Add(dsb);
host.Open();
Console.WriteLine("Host started, press enter to close...");
Console.ReadLine();
}
}
}
我的服务:
using System;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Threading;
using System.Threading.Tasks;
namespace WaitEventTest {
[ServiceContract, ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
class WebService {
static SemaphoreSlim S = new SemaphoreSlim(0);
static int Q;
static DateTime T0 = DateTime.Now;
static DateTime T1 = DateTime.Now;
static TimeSpan T = TimeSpan.FromSeconds(0);
[OperationContract, WebGet(UriTemplate = "test")]
public string Test() => "OK";
[OperationContract, WebGet(UriTemplate = "signal")]
public string Signal() {
for (int i = 0; i < Q; i++) S.Release();
return "OK";
}
[OperationContract(AsyncPattern = true), WebGet(UriTemplate = "waitEvent")]
public async Task<string> WaitEvent() {
T1 = DateTime.Now;
T = T1 - T0;
Q++;
T0 = DateTime.Now;
await S.WaitAsync();
Q--;
return "OK";
}
}
}
当有一个“用户”时,仅对WaitEvent
进行一次调用,它无限期地等待信号返回响应。
但是,当更多的客户会致电WaitEvent
时,我希望WaitEvent
会被调用多次,但是所有的呼叫都将等待信号完成。
这不是这里发生的情况。首次调用会阻塞该方法,因此其第一行代码仅执行一次。随后的呼叫等待。 20秒后,它们全部一次通过,因此WaitEvent
被调用n次。然后,如果信号被调用,所有待处理的请求将按预期立即解决。
我的问题是:为什么20秒?为什么第二个呼叫不输入代码立即而是等待?
为什么我的方法是异步的? 为什么,当我的服务设置为多线程时?
似乎WCF中的某些内容对我来说是远程呼叫的队列,而我无法知道有多少队列在排队。
这是不可接受的。我不想注册每个电话,然后稍后,在我选择的确切时间,我将回复所有已注册的电话。
如何实现这种行为?
顺便说一句,我的服务是使用Woof.Service NuGet包自行托管的。