2015-12-14 65 views
1

我正在处理一个正在导入客户端的CSV文件。 该CSV应该包含一些信息,这些信息将用于在我公司的数据库的某个表中执行更新。我的C#函数处理文件,查找错误,如果没有发现错误,它会发送一堆更新命令(文件通常从50到100000行不等)。 到现在为止,我在同一个线程中执行更新(逐行执行更新),但取决于文件,它会变慢一点,所以我选择将所有SQL发送到Azure SQL队列(这是一种获取大量“消息”并再次运行数据库的SQL代码的服务),因此,客户端不必等待执行的操作。 它得到了一些快,但仍然需要很长时间(由于对Azure SQL队列的请求)。所以我注意到将该操作放在单独的线程中并将所有SQL发送到我的Azure SQL队列。在单独的线程中执行长操作是否安全?

虽然我有点担心。在单独的线程中执行长操作真的很安全吗?它可靠吗?

+0

定义“安全”。您将需要处理处理/报告错误,因为您不能只返回一个数字或错误字符串。 –

+0

您熟悉如何在Sql Server上创建临时表,那么您可以创建一个可以同时处理所有行的XML批量插入。我现在通过将csv文件转换为数据表格,然后将数据上载到数据表中并进行错误检查等操作完成。然后我写了自己的函数将数据表转换为XML,然后将单个调用转换为存储过程我通过xml和临时表将大容量插入到单个表中 – MethodMan

+0

使用线程几乎是不安全的。野兽的性质。但是,如果它是一个简单的数据库更新,那很可能不会导致任何问题。如果您可以使用异步操作(以及数据库提供者,您可能可以),我会走这条路,因为我认为您可以更安全地实现用户响应的目标。 –

回答

1

第二个线程与您以前使用的主线程一样100%。我希望我有一些权威的答案,但这是一个普遍的做法,人们不再写这些...

所以,是的,卸载工作到第二个线程是安全的,可以考虑通过大多数建议的方式去通过它。

编辑1
好吧,如果你的线程运行在IIS上,你需要注册,或一旦请求/效应初探周期完成,它会杀死它,它会因为死...

+0

如果他正在开发一个IIS应用程序,那么你的语句不能包含true。你不用IIS注册线程,你的AppDomain可能会在线程完成工作之前关闭。 –

+0

@ScottChamberlain是的,但在这个特定的情况下,他在第一句话中表示,行动发生在客户端...所以我相信,鉴于问题的性质,我不认为这是案件...但罚款,不好更新我的回答 – Leonardo

+1

为了完成更新,注册线程最简单的方法是使用[HostingEnvironment.QueueBackgroundWorkItem](http://blogs.msdn.com/b/webdev/archive/ 2014/06/04/queuebackgroundworkitem-to-reliable-schedule-and-run-long-background-process-in-asp-net.aspx)启动线程(尽管如此,它仍然无法完成,但你会得到一个CancellationToken,当你有90秒的时间完成你的工作或优雅地取消你的工作时,你可以看到它。 –

相关问题