用于远程存储/管理计算的c#技术选项

本文关键字:计算 管理 选项 技术 程存储 存储 用于 | 更新日期: 2023-09-27 17:54:33

试图找出我有什么选项可以让本地运行的程序从远程源获得其计算或计算结果。

问题:我有一个数据采集应用程序,读取大量的仪器和收集数据,同时测试设备。这些数据经过各种形式的聚合(最小值、最大值、平均值等),然后对其进行多次计算,结果保存到数据库中。这个过程在一次测试中会发生几次。此应用程序在专用于执行此测试的机器上运行,但测试之外的用户也需要执行相同的计算以进行实验,数据分析等。

在过去,我们的两个应用程序(一个与设备有关,一个与用户有关)将在每次计算更改时进行更新,然后部署到任何地方。

问题:我正在寻找可能的方法来解决这个问题。

到目前为止我发现了什么

1)。WCF。

:只需更新服务器,两个程序现在都可以利用新的计算。

担忧:DataContract将包含几个必须传递给函数的类。(根据具体情况,"数据"的总大小可以从1 MB到1 GB不等)。不确定此时数据量是否是一个实际问题。

2)。存储编译后的dll并下载/加载。向服务器查询类库。下载它。将其加载到内存中并使用计算结果。

:不必来回传递大量的数据。

担忧:DLL现在驻留在每台计算机上。人们可能不会被强制更新到正确的版本,这可能会导致问题。本地用户计算机上的DLL可能存在安全风险。

用于远程存储/管理计算的c#技术选项

这是一个相当棘手的问题,我认为有很多方法可以尝试解决它。这里有一些想法可以让你开始

  1. Akka使用。来看看Akka。可以解决您的远程部署问题。但我不确定,如果您的用户决定临时加入集群,而不是拥有一组固定的位置来分发计算,那么这是否符合您的需求?

  2. 如果计算是简单的数学公式,您可以将它们存储为一组规则并下载公式。即更多地采用规则引擎方法。参见c#表达式树

  3. 基于浏览器的方案。从易于远程部署的角度来看,这显然是成功的。如果你不想使用JavaScript,有很多选择,例如PureScript, f# (Fable), clojurescript, ELM,甚至可能是c#与JSIL/Bridge。从桌面到网页是一个很大的转变,所以要确保你知道你在做什么:)

在尝试了几个选项后,我们发现来回发送数据太麻烦了。相反,我们选择用我们需要的所有计算动态加载DLL,并使用一组接口来定义行为。

我所做的学习和发现是整洁的是,我可以将DLL存储在数据库中,并将其直接加载到内存中,而不必首先将其复制到硬盘驱动器,从而提供了一个额外的保护层。使用SQL和filesream。它还提供了一种版本控制,我可以选择从数据库中加载哪个版本的DLL,并计算/重新计算各种值。

 // Read in File
 using (SqlFileStream fileStream = new SqlFileStream(path, transaction, System.IO.FileAccess.Read))
 {
      byte[] buffer = new byte[size];
      int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
       // Load Assembly
       Assembly DLL = Assembly.Load(buffer);
       Type myInterfaceType = DLL.GetType("MyNamespace.MyClass");
       // Get access to the root interface
       IMyInterface myClass = (IMyInterface)Activator.CreateInstance(myInterfaceType);
 }