在ASP.NET中,线程、TPL和异步委托有何区别?

3
我有一个在生产环境中运作良好的应用程序,但我想知道我是否可以更好地实现并发。此应用程序基于ASP.NET .NET 4和C#。基本上,它动态生成n个SQL语句(目前大约50个),然后并发地运行它们并将数据写入.csv文件中。
编辑:首先我创建一个线程来处理所有工作,以便页面请求可以返回。然后在该线程上...
对于每个SQL语句,我使用TPL创建新任务,并使用datareader执行它,并将数据写入磁盘。当最后一个文件被创建时,我将一些摘要数据写入摘要文件中,并将所有文件压缩成zip文件并提供给用户。
我应该使用线程还是异步委托?
由于我读取的数据库技术细节的特殊性,动态创建SQL语句是完全必要的,所以请不要就此进行解释。 (这是一个专有系统的后端,拥有7,000多个表格)。

在你修改代码之前,确保你理解异步和多线程/多任务的区别。它们并不相同,你应该在你的场景中将它们结合起来。 - MarcinJuraszek
@Noseratio: 另外,关于异步SqlDataReader API,我们使用的是.NET 4而不是4.5。我认为那个API不可用。另外,我使用ODBC是因为我同时连接Oracle和SQL Server,而且使用System.Data.Odbc实现起来更容易一些。 - user2416689
@user2416689,在ASP.NET中交叉请求线程也不是一个好主意,这在SO上已经讨论过很多次了。你应该运行一个Windows服务并与其通信。或者在单独的主机上运行WCF服务。 - noseratio - open to work
@Noserati,请您再解释一下或者提供一些链接吗?我在“cross-request thread”下面什么也找不到。我猜这样长时间挂起一个线程是不好的。这会消耗服务器上所有应用程序池的线程,还是只会影响我的应用程序所在的那个池子呢? - user2416689
@Noseratio:我说的是一个ASP.NET AJAX计时器(最终成为javascript),它每隔几秒钟就会发出一个ajax请求,以查看zip文件是否存在。所以不会闲置。 - user2416689
显示剩余4条评论
2个回答

0
如果我们从正在服务于HTTP请求的线程中启动一个新的ASP.Net线程,并且新线程出现未处理的异常,那么工作进程将立即崩溃。即使我们使用WCF服务并从ASP.Net调用它,ASP.Net线程也将等待结果。因此最好使用任何排队机制,以便请求在队列中,并且队列可以根据处理能力在不同时间进行处理。当然,当我们说排队时,我们需要考虑队列故障、重新排队等问题...但如果应用程序很大并且需要扩展,则值得一试。

0
我应该使用线程还是异步委托?
显然,您的后台线程操作跨越了单个 HTTP 请求的边界。在这种情况下,您使用的 API 并不重要:Task.Run、Delegate.BeginInvoke、ThreadPool.QueueUserWorkItem、new Thread 或其他任何 API。
您不应该在 ASP.NET 的地址空间内运行生命周期跨越多个 HTTP 请求的长时间后台线程操作。虽然相对容易实现,但这种方法可能存在 IIS 可维护性、可伸缩性和安全性方面的问题。为此,创建一个 WCF 服务,并从 ASP.NET 页面调用它: 如何:将 WCF 服务托管在托管 Windows 服务中

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接