对WCF方法的后续调用被阻止,直到之前完成或20秒过去

时间:2018-07-26 11:08:50

标签: c# wcf

我要在这里实现的目标是通过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包自行托管的。

0 个答案:

没有答案