我是新来的线和需要帮助的。我有一个数据输入应用程序,需要量过高的时间插入一个新的记录(i。e50至75秒)。所以我的解决方案是以发送电插入声明通过一个线程池和允许用户开始输入数据的记录,同时插入它返回一个新的记录ID同时,插入运行。我的问题是,用户可以打保存前的新的身份返回,插入。

我试图把在一个布尔变其获取设置为真正通过一个事件从该线时被安全地保存。然后,我放在

while (safeToSave == false)  
{  
    Thread.Sleep(200)  
}  

我认为这是个坏主意。如果我跑的救方法之前,胎的回报,它得到坚持。

所以我的问题是:

  1. 是否有更好的方式这样做?
  2. 我做错了这里?

谢谢你任何帮助。
道格

编辑的更多信息:

这是在做插入一个非常大的(接近最大尺寸)统数据库。该文件具有约200领域,并几乎同样多的索引。
并且在你问之前,不,我不能改变它的结构,因为它是在这里,之前我是有一吨的遗产代码打击它。第一个问题是,为了获得一个新ID我必须先找到max(id)在表后增加"和"校验。这需要大约45秒。然后第一刀是简单地插入这一新的身份证和enterdate领域。这表不/不可放入一个DBC这样的规则出自动产生id等。

@约书亚。壶
你有的过程正确的,我认为短期内,我将只是禁止的保存按钮,但我会找到你的思想穿成一个队。你有任何引用的内容,我应该看看?

有帮助吗?

解决方案

所有的人,包括你,处理核心问题(插入时间,为什么你做插入,然后更新),所以我会坚持只是技术问题与你的拟议解决方案。所以,如果我得到的流动权利:

  • 螺纹1:开始的数据输入 记录

  • 螺纹2:背景调的数据库检索新Id

  • 保存按钮总是启用, 如果用户试图拯救之前线 2完成了,你把#1睡 200毫?

最简单的,不是最好的回答是只有按钮残疾人和有线做一个 回调 一个代表能够按钮。他们不能开始更新的操作,直到你确定的事情设置适当。

不过,我觉得一个更好的解决方案(虽然它可能被夸大了,如果你只是建立一个Q&D前结束统),将把这些节省业务成队列中。用户可以关键尽可能快地,然后要求投入的东西喜欢的内容和它们可以完全在他们自己的时间异步的。

其他提示

1)很多:),例如你可以禁止的"保存"按钮的话,线就是插入的对象,或者你可以设置一线工作人员处理一队的"保存的请求"(但是我想这里的问题是,用户想要的修改新创建的记录,所以禁用的按钮也许是更好)

2),我认为我们需要更多一些代码,以便能够了解...(或者,也许是一个同步的问题,我不是一个错误的粉丝线过)

顺便说一句,我只是不明白为什么插入应该采取这么长..我认为你应该检查代码!<-只是作为查尔斯以前指出的(对不起,dind不读后):)

使用 未来 而不是原始的线程池的行动。执行未来,允许用户以做任何他们想要的,当他们打存在的第2次记录时,请求的数值从未来。如果第1插入已经完成,你将得到身份和第2次插入将被允许踢掉。如果你还在等待关于第1操作的,未来会阻止它是可用,然后在第2次操作可以执行。

你不保存任何时间,除非用户慢于操作。

首先,你也许应该找出,并修复,因为一个插花这么长时间...50至75秒钟是不合理的任何现代化的数据库,用于一个单一的行插入,并指示东西需要解决,如指数,或阻止...

其次,为什么你插入记录之前,你有数据?通常情况下,数据输入应用程序编码,以便插入是不是企图,直到所有的必要数据插入已经收集了从用户。你这样做是因为你想获得新的身份从数据库,然后"更新"新记录的空与用户输入的数据以后呢?如果是这样,几乎每一个数据库供应商具有一种机制,在这里你可以做插入只有一次,不知道的新的身份,并有数据库返回的新的身份证,以及...什么样的供应商数据库是你使用?

是一种溶液,像这样的可能:

预算的唯一标识的用户之前,甚至开始增加。保持名单的独特的身份证,已在该表中,但是有效的地方持有人。当用户试图插入、保留他们其中一个独特的标识,用户按保存,他们现在更换地方持有人与他们的数据。

PS:这是难以确认这一点,但应注意以下问题并发什么您建议(有或没有线):用户,开始增加,用户B开始增加,用户的一个计算ID1234作为最大的免费识、用户B计算ID1234作为最大的免费身份证。用户插入一个ID1234,用户B插入ID1234=繁荣!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top