【发布时间】:2023-09-17 19:54:01
【问题描述】:
我有一个在生产环境中运行良好的应用程序,但我想知道我是否可以更好地实现并发......
ASP.NET .NET 4,C#
基本上,它会即时生成 n 条 sql 语句(目前大约 50 条),然后同时运行它们并将数据写入 .csv 文件。
编辑:首先我创建一个线程来完成所有工作,以便页面请求可以返回。然后在那个线程上......
对于每个 SQL 语句,我使用 TPL 创建一个新任务,并使用数据读取器执行它并将数据写入磁盘。创建最后一个文件后,我将一些摘要数据写入摘要文件并将其全部压缩并提供给用户。
我应该改用线程还是异步委托?
我没有发布代码,因为我只是想知道我的整体方法(即 TPL)是否是这种情况下的最佳选择。
请不要教我创建动态 sql,由于我正在阅读的数据库的技术性并且与问题无关,这是完全必要的。 (它是专有系统的后端。有 7000 多个表)。
【问题讨论】:
-
确保在对代码进行任何更改之前了解异步和多线程/多任务之间的区别。它们不一样,您可能应该在您的场景中将两者结合起来。
-
在 ASP.NET 中使用
Task.Run或Task.Factory.StartNew确实是个坏主意。在完成所有任务之前,HTTP 请求不会完成。您实际上只会损害 Web 应用程序的可扩展性。请改用async SqlDataReader API。 -
@MarcinJuraszek 我想我理解这两个概念之间的区别。 :) 你能详细说明一下吗?好处?所以也许在数据读取器上调用一些异步方法(没有检查是否有)?当我提到异步委托时,我在想也许我应该将它作为一堆异步回调来完成,每个 sql 查询/写入一个,完成后它会进行压缩....
-
@Noseratio 谢谢,但我已经考虑到了这一点。当用户单击按钮时,我为所有这些东西创建一个单独的线程,然后返回,然后在该线程上创建所有读/写线程。这意味着请求会立即返回。然后页面使用更新面板中的计时器来轮询整个操作的完成情况。
-
@Noseratio:另外,回复:异步 SqlDataReader API,我们使用的是 .net 4 而不是 4.5。不要认为这是可用的。另外,我使用的是 ODBC,因为我同时使用了 Oracle 和 SQL Server,而且使用 System.Data.Odbc 实现起来更容易。
标签: asp.net io delegates task-parallel-library datareader