C# WCF PerCall内部操作跨调用方事件处理
通过我的C# WCF PerCall内部操作跨调用方事件处理,c#,.net,wcf,asynchronous,event-handling,C#,.net,Wcf,Asynchronous,Event Handling,通过我的WCF服务,我正在解决一个既影响性能又影响设计的问题 该服务是一个无状态的RESTful服务,它做了许多简单和常见的事情,所有这些都像花花公子一样工作。 但是,有一个手术,最近开始让我很害怕,所以有一个问题: 客户端对操作进行参数化调用,结果的计算需要大量时间才能完成。但是,在服务器上的数据更改之前,使用相同参数调用的结果将始终相同。而且客户使用完全相同的参数拨打了大量电话。然而,服务器无法预测用户会喜欢的参数,令人遗憾的是,结果无法预先计算 所以我提出了缓存层,并将结果对象存储为一个键
WCF
服务,我正在解决一个既影响性能又影响设计的问题
该服务是一个无状态的RESTful服务,它做了许多简单和常见的事情,所有这些都像花花公子一样工作。
但是,有一个手术,最近开始让我很害怕,所以有一个问题:
客户端对操作进行参数化调用,结果的计算需要大量时间才能完成。但是,在服务器上的数据更改之前,使用相同参数调用的结果将始终相同。而且客户使用完全相同的参数拨打了大量电话。然而,服务器无法预测用户会喜欢的参数,令人遗憾的是,结果无法预先计算
所以我提出了缓存层,并将结果对象存储为一个键值对,其中key表示导致这个结果的参数。如果相关数据发生变化,我只需刷新缓存。这仍然很简单,没有问题
客户机调用服务,服务器接收调用,查看结果是否已缓存,并返回结果(如果已缓存)。但是,如果结果尚未缓存,客户端将启动计算。计算可能需要2分钟(平均时间10-15秒)才能完成,到那时,其他客户端可能会出现,因为缓存仍不知道结果,因此每个客户端都将启动自己的计算。这是而不是我们真正想要的,所以有一个标志,如果有人已经用这个参数开始了计算,这就是代码中的位置,其他调用方的代码停止并等待计算完成并插入到缓存中,每个被调用的实例将从中获取结果,将其返还给客户并进行处置。
这就是我一直在努力的部分
到目前为止,我的解决方案看起来是这样的(在你进一步阅读之前,我想警告你,因为我的经验还没有达到令人满意的水平,而且我在所有C
,WCF
和相关的东西中仍然是一个大noob…不必告诉我我是noob,因为我完全意识到这一点):
Stopwatch sw=新秒表();
sw.Start();
while(true)
{
if(Cache.Contains(parameters)| | sw.appeased>threshold)
打破
睡眠(100);
}
…在这里做相关的事情
如您所见,此解决方案存在更多问题:
TPL
和async wait,但我不仅在这一领域的经验非常有限,更可悲的是,我真的需要帮助解释它如何与事件结合在一起(或者我甚至需要它们吗?)。。。当我在测试控制台应用程序中尝试/运行一些小东西时,我可能会成功,但将它引入我的WCF
应用程序的更大环境中,我很难找到线索
所以伙计们,我会很高兴地欢迎每一种与我的话题相关的想法、建议、指导、链接、代码和批评
我意识到这一事实,它可能会令人困惑,并将尽我所能消除所有误解和棘手的部分,请我这样做
谢谢你的帮助