Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF PerCall内部操作跨调用方事件处理_C#_.net_Wcf_Asynchronous_Event Handling - Fatal编程技术网

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);
}
…在这里做相关的事情
如您所见,此解决方案存在更多问题:

  • 拥有循环、检查和所有这些东西不仅让人觉得难看,因为许多客户都以这种方式等待,资源往往会激增
  • 如果操作失败(初始调用方的计算未能在阈值范围内交付),我真的不知道,下一个必须尝试计算的客户机,或者如何,甚至我是否应该再次运行操作,或者向客户机返回错误。。。 编辑:这与同步无关,我知道我的应用程序的某些部分需要锁定,因此我的问题没有得到解决
  • 当调用的代码仍在执行计算时(导致这样的结果是错误的),相关的服务器端数据发生更改时,我应该怎么做。。。此外,这还会对应用程序产生一些其他可怕的影响,但是,是的,我现在要问的问题是:
  • 所以,和大多数时候一样,我做了家庭作业,在提问之前四处观察,但没有成功地找到一些我可以理解或适合我的问题和领域的指导

    我有一种强烈的感觉,我必须引入某种(静态?)基于事件的and或异步类(如果愿意,可以称之为层),它以某种注册到我和我将给你一个戳/戳所有注册线程的方式执行一些技巧并组织和管理所有这些事情。但是,尽管能够(在一定程度上)使用新引入的任务、
    TPL
    和async wait,但我不仅在这一领域的经验非常有限,更可悲的是,我真的需要帮助解释它如何与事件结合在一起(或者我甚至需要它们吗?)。。。当我在测试控制台应用程序中尝试/运行一些小东西时,我可能会成功,但将它引入我的
    WCF
    应用程序的更大环境中,我很难找到线索

    所以伙计们,我会很高兴地欢迎每一种与我的话题相关的想法、建议、指导、链接、代码和批评

    我意识到这一事实,它可能会令人困惑,并将尽我所能消除所有误解和棘手的部分,请我这样做

    谢谢你的帮助