Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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# 线程池和GUI等待问题_C#_Threadpool_Deadlock - Fatal编程技术网

C# 线程池和GUI等待问题

C# 线程池和GUI等待问题,c#,threadpool,deadlock,C#,Threadpool,Deadlock,我是新手,需要帮助。我有一个数据输入应用程序,插入一条新记录需要花费非常长的时间(即50-75秒)。因此,我的解决方案是通过线程池发送insert语句,并允许用户在insert运行时开始输入记录的数据,从而在insert运行时返回新的记录ID。我的问题是,用户可以在插入返回新ID之前点击save 我尝试输入一个布尔变量,当安全保存时,通过该线程的事件将其设置为true。然后我把它放进去 while (safeToSave == false) { Thread.Sleep(200)

我是新手,需要帮助。我有一个数据输入应用程序,插入一条新记录需要花费非常长的时间(即50-75秒)。因此,我的解决方案是通过线程池发送insert语句,并允许用户在insert运行时开始输入记录的数据,从而在insert运行时返回新的记录ID。我的问题是,用户可以在插入返回新ID之前点击save

我尝试输入一个布尔变量,当安全保存时,通过该线程的事件将其设置为true。然后我把它放进去

while (safeToSave == false)  
{  
    Thread.Sleep(200)  
}  
我认为这是个坏主意。如果在踏板返回之前运行save方法,它就会卡住

因此,我的问题是:

  • 有更好的方法吗
  • 我做错了什么
  • 谢谢你的帮助。
    道格

    编辑以获取更多信息:

    它正在向一个非常大(接近最大大小)的FoxPro数据库中插入数据。该文件有大约200个字段和几乎相同数量的索引。
    在你问之前,不,我不能改变它的结构,因为它在我之前是在这里,有大量的遗留代码击中它。第一个问题是,为了得到一个新的ID,我必须首先在表中找到max(ID),然后对它进行递增和校验。这大约需要45秒。然后第一个插入就是简单地插入新id和enterdate字段。此表没有/不能放入DBC中,因此排除了自动生成ID等

    @joshua.ewer

    您的过程是正确的,我认为短期内我将禁用save按钮,但我将研究您将其传递到队列中的想法。您是否有任何关于MSMQ的参考资料需要我查看?

    首先,您可能应该找出并修复插入时间过长的原因。。。50-75秒对于任何现代数据库来说都是不合理的,因为它只需要一行插入,并且表明还需要解决其他问题,比如索引或阻塞


    第二,为什么在获得数据之前要插入记录?通常,对数据输入应用程序进行编码,以便在从用户处收集插入所需的所有数据之前,不会尝试插入。您这样做是因为您试图先从数据库中获取新Id,然后用用户输入的数据“更新”新的空记录吗?如果是这样的话,几乎每个数据库供应商都有一种机制,在这种机制中,您可以只插入一次,而不知道新ID,并且让数据库也返回新ID。。。您使用的是哪个供应商数据库

    首先,您可能应该找出并修复插入时间过长的原因。。。50-75秒对于任何现代数据库来说都是不合理的,因为它只需要一行插入,并且表明还需要解决其他问题,比如索引或阻塞

    第二,为什么在获得数据之前要插入记录?通常,对数据输入应用程序进行编码,以便在从用户处收集插入所需的所有数据之前,不会尝试插入。您这样做是因为您试图先从数据库中获取新Id,然后用用户输入的数据“更新”新的空记录吗?如果是这样的话,几乎每个数据库供应商都有一种机制,在这种机制中,您可以只插入一次,而不知道新ID,并且让数据库也返回新ID。。。您使用的是哪个供应商数据库

    1)许多:),例如,您可以在线程插入对象时禁用“保存”按钮,或者您可以设置一个线程工作程序来处理“保存请求”队列(但我认为这里的问题是用户想要修改新创建的记录,因此禁用该按钮可能更好)

    2) 我想我们需要更多的代码来理解。。。(或者可能是同步问题,我也不是线程的bug爱好者)

    顺便说一句,我只是不明白为什么插入要花这么长时间。我认为你应该先检查代码 1)许多:),例如,您可以在线程插入对象时禁用“保存”按钮,或者您可以设置一个处理“保存请求”队列的线程工作程序(但我认为这里的问题是用户想要修改新创建的记录,因此禁用按钮可能更好)

    2) 我想我们需要更多的代码来理解。。。(或者可能是同步问题,我也不是线程的bug爱好者)


    顺便说一句,我只是不明白为什么插入要花这么长时间。我认为你应该先检查代码 包括您在内的所有其他人都解决了核心问题(插入时间、为什么要进行插入,然后进行更新),因此我将只关注您提出的解决方案的技术问题。因此,如果我得到了正确的流程:

    • 线程1:启动的数据输入 记录

    • 线程2:后台调用DB以检索新Id

    • 保存按钮始终处于启用状态, 如果用户试图在线程之前保存 2完成后,您将1置于睡眠状态 200毫秒

    最简单但不是最好的答案是禁用按钮,并让该线程与启用按钮的代理进行交互。在您确定设置正确之前,他们无法启动更新操作


    不过,我认为一个更好的解决方案(尽管如果您只是为FoxPro构建一个Q&D前端,这可能有些言过其实),就是将这些保存操作放入队列中。用户可以尽快输入密钥,然后将请求放入类似MSMQ的程序中,它们可以在自己的时间内异步完成。

    包括您在内的所有其他人都解决了核心问题(插入时间,为什么要插入,然后更新),因此我将只关注您提出的解决方案的技术问题。因此,如果我得到了正确的流程:

    • 线程1:St