2012-03-12 89 views
2

我有多个动作同时运行。当动作1完成时 - 随后是动作Nr.2,然后是3,然后是1或9或9,或者是10或7 ...随机顺序。用C#创建,存储和检索动态数据

enter image description here

我需要:

  1. 存储数据,我得到的行动/活动的结果。

  2. 当相同动作继续时检索此数据!通过唯一的ID

  3. 这里

    • 是我想象:

我能确定行动

  1. 启动程序。

  2. 第一步是检查新活动的数据是否存在 - 为此,我们抓取ID并进行检查。因为它是我们新的/第一个动作/活动,所以没有任何过去的数据,所以在动作结束时,我们创建并将新数据保存到某种动态存储中。

    string [,] ID123 = new string [2,3] {{“120”,“200”,“#ffc90e”},{“380”,“200”,“#22b14c”}}

  3. 当动作1结束时,动作2开始,实际上,我们的做法与我们在第3页中做的相同。

    string [,] ID456789 = new string [2,3] {{“10”,“5”,“#40”},{“6”,“8”,“#80”}}

  4. 现在是活动1了!我们通过独特的ID来识别它。这次,如果我们搜索现有数据,我们会发现:

    string [,] ID123 = new string [2,3] {{“120”,“200”,“#ffc90e”},{“ 380“,”200“,”#22b14c“}};

  5. 现在我做一些编辑 + 如果需要添加新值。继续。

一,我已经想到了简单的解决方法是 - 简单地创建一个临时文件与“ID .TXT”的名字。不幸的是,我将会同时运行多达10-15个动作,所以这种方法不会像将所有内容记录到内存一样快。问题是 - 我该怎么做? sql?文本?

一些事实:

  • ID总是不同的不同活动

  • 我不知道确切活动计数

  • 我”(10和15之间变化)将需要存储阵列类型数据,即

串[,]数组:1,15,32,12

2,图11,EFG,0

5,9,5,ABC

...

  • 类似的问题:Dynamic array in C#

  • 会出现在我的代码中的一些条件,将触发“数据删除”,行动有寿命;)

+0

序列化听起来像它应该符合法案。一旦你有数组序列化,数据存储基本上变得不重要。 – 2012-03-12 19:21:25

+0

从来没有听说过它..会尝试;)从第一次看序列化看起来像魔法文件保存.. – Alex 2012-03-12 19:59:26

+0

我绝对不会称它为_enchanted_,但它符合其目的。 – 2012-03-12 20:00:27

回答

1

目前还不清楚你想在这里,在何处以及如何行动进入这个产业链,以及如何你需要对付他们完成的任务。

只要跟踪当前正在处理的内容,您所需要的就是恰当的并发性。可以使用.NET 4.0中内置的几个对象,也可以创建自己的对象。由于这些数据是动态的,因此可能不应该持续存在,除非您期望您的流程能够在终止后准确停止它的位置。因此,例如,您可以使用一个ConcurrentDictionary<string, string[,]>,它将存储二维数组,由ID字符串键入,该字符串在字典中必须是唯一的(即使两个ID的数组具有相同的尺寸和值)。并发检查是内置的,这意味着你可以有多个线程对这个字典执行多个动作,而不必担心两个线程可能同时尝试读取或写入相同内容的“竞争条件”。

请注意,无论出于何种原因,当进程结束时,内存中作为进程一部分的数据将不再存在。如果你不希望发生这种情况,你可以有一个线程,它的工作是将ConcurrentDictionary的内容保存到文件或数据库中。由于它是一个线程,从线程安全的数据集中读取,很大程度上避免了文件写入中的并发问题。只要ConcurrentDictionary中的一条记录不依赖于另一条记录中的数据(您仍然可以处理下列情况:记录取决于另一个,但它变得更复杂)。此线程可以在执行其他操作期间或基于计时器或您选择的任何符合您需要的内容时“启动”。

+0

窗口标题更改会触发操作。当出现新窗口 - >记录数据 - >等待新窗口 - >第一个窗口再次出现 - >获取旧数据,修改,添加 - >等待窗口更改。 “ConcurrentDictionary”与多线程, 对?从表现来看,这很棒。 “请注意,当进程结束时,作为进程一部分的内存中的数据将不再存在。”是否有可能在进行不间断信息处理一小时内丢失数据?如果是这种情况,那么我想在不同的文件中保存信息是一个更好的选择。 – Alex 2012-03-12 20:07:51

+0

如果您的流程只要需要执行处理就会保持打开状态,并且在失败或用户退出时丢失所有数据是可以接受的,那么您不需要保存数据。在任何其他情况下,您应该根据需要坚持到某种数据存储区,使用单个线程负责持续对字典数据进行相关更改。不过,我在这里嗅到了一些非常强烈的代码味道;你正在决定基于窗口标题做什么?坏。 – KeithS 2012-03-12 20:30:10