【问题标题】:How to queue multiple calls (via AJAX) to FileStream / StreamWriter?如何将多个调用(通过 AJAX)排队到 FileStream / StreamWriter?
【发布时间】:2019-07-29 01:40:10
【问题描述】:

对不起,如果标题不完全正确,不是 100% 确定我在找什么。

我有一些代码执行以下操作:

public static ProcessData()
{
    AddNewData()
    GetAllData()
    BuildTSV();
    Send();
}

这是一个 MVC Web 应用,ProcessData 是一个 Ajax 调用,传入一些表单数据。 AddNewData 写入数据库,这是对执行基本 INSERT 的存储过程的简单调用。 GetAllData 查询数据库,这是对单个表的简单 SELECT 语句。 BuildTSV 使用 db 数据构造一个文件,然后我们将它发送到远程服务器。

如果 BuildTSV 连续命中足够快,我会遇到文件锁定问题(而不是数据库)。 BuildTSV 使用了一个简单的 StreamWriter。

我无法更改此工作流程,我想以某种方式汇集 AddNewData() 调用,然后仅在它们全部完成后继续。

线程?排队?阻止集合?等待文件是否被锁定,然后重试?

这对我来说是全新的,并且很难理解 1001 种不同的方法。

【问题讨论】:

  • “我想以某种方式汇集 AddNewData() 调用,然后仅在它们全部完成后继续。” - 即使你这样做,会发生什么当你决定他们都完成了,但又来了一个?还是两个?我认为您接受此数据的方法可能不正确。如果没有AddNewDataGetAllData 的实现,我不能肯定。
  • AddNewData 是对存储过程的简单调用,只不过是直接插入。 GetAllData 与选择数据相同。单表,几列。
  • 如果是简单的INSERT,锁问题是从哪里来的?
  • 在 BuildTSV 中。我必须从表中提取数据并将其作为 TSV 上传到远程服务器。在构建 TSV 时,如果第二个请求足够快,文件就会被锁定。
  • 您是否必须每次都在相同的文件位置写入 TSV,还是每次调用都使用一个唯一的临时文件?

标签: c# .net multithreading model-view-controller locking


【解决方案1】:

最后我创建了一个小服务来处理这个问题。

我会查询数据库并跟踪表中的行数。如果这增加了,我会选择所有数据并将其处理成一个平面文件,然后发送。这每隔几分钟运行一次,解决了我所有的问题。

我遵循this as a starting 点,基本上将我现有的负责将数据提取到平面文件中然后发送的代码转储,同时添加了一些日志记录和服务停止时的电子邮件通知。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 2013-11-02
    • 2011-06-25
    • 2013-02-17
    • 2014-10-14
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    相关资源
    最近更新 更多