C# 在单独的线程中执行长操作安全吗?

C# 在单独的线程中执行长操作安全吗?,c#,sql-server,multithreading,csv,azure,C#,Sql Server,Multithreading,Csv,Azure,我正在处理一个正在客户端导入的CSV文件。 这个CSV应该包含一些信息,这些信息将被指定在我公司数据库的一个表中执行更新。 我的C#函数处理文件,查找错误,如果没有发现错误,它会发送一系列更新命令(文件通常从50到100000行不等)。 到目前为止,我一直在同一个线程中执行更新以执行更新(逐行),但速度有点慢,这取决于文件,因此我选择将所有SQL发送到Azure SQL队列(这是一个获取大量“消息”并在数据库中再次运行SQL代码的服务),以便,客户机不必等待那么多时间才能执行操作。 速度稍微快了

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


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

第二个线程与您使用的主线程完全相同。我希望我手头有一些权威的答案,但这是一个如此普遍的做法,人们不再写这些了

因此,是的,将工作卸载到第二个线程是安全的,并且可以被大多数人认为是推荐的方法

编辑1

好的,如果你的线程在IIS上运行,你需要注册它,否则它就会死掉,因为一旦请求/响应周期结束,它就会杀死它…

定义“安全”。您将需要处理处理/报告错误,因为您不能只返回数字或错误字符串。如果您熟悉如何在Sql Server上创建临时表,那么您可以从那里创建一个XML大容量插入,可以同时处理所有行。目前,我通过将csv文件转换为数据表来实现这一点,然后,一旦数据上传到数据表并完成错误检查等。。然后,我编写了自己的函数将datatable转换为XML,然后对存储过程进行一次调用,我通过XML和temp table对单个表进行批量插入,使用线程几乎是不安全的。野兽的本性。但是,如果它是一个简单的数据库更新,那么很可能不会给您带来任何问题。如果您可以使用异步操作(使用DB提供程序,您可能可以),我会走这条路,因为我认为您可以更安全地实现用户响应的目标。@usr the'可靠吗“这是一个具体问题。例如,在IIS中,启动一个线程来执行后台工作是不可靠的,因为IIS可能会关闭您的AppDomain并调用线程。在您的线程上中止。该线程不用于执行更新,它只会点击我的Azure SQL队列服务。我有一个WebJob,负责从队列中获取消息,并对数据库运行SQL代码。如果他正在开发IIS应用程序,则您的语句不正确。如果您没有向IIS注册线程,您的AppDomain可能会在线程完成其工作之前关闭。@ScottChamberlain是的,但在这种特定情况下,他在第一句话中说,该操作发生在客户端。。。所以我相信,考虑到问题的性质,我认为情况并非如此。。。但是,好的,我会更新我的回答来完成更新,注册线程最简单的内置方法是启动线程(即使这样,它仍然没有完成,但您确实会得到一个CancellationToken,您可以查看它,以了解何时您还有90秒的时间完成您的工作或优雅地取消您的工作)。