我有一个在生产中运行良好的应用程序,但我想知道我是否可以更好地实现并发....
ASP.NET .NET 4,C#
基本上,它会动态生成n个sql语句(目前约为50个),然后同时运行它们并将数据写入.csv文件。
编辑:首先我创建一个线程来完成所有工作,以便页面请求可以返回。然后在那个线程......
对于每个SQL语句,我使用TPL创建一个新任务并使用datareader执行它并将数据写入磁盘。创建最后一个文件后,我将一些摘要数据写入摘要文件并将其全部压缩并提供给用户。
我应该使用线程或异步代理吗?
我还没有发布代码,因为我真的只是想知道我的整体方法(即TPL)是否是这种情况下的最佳选择。
请不要教我创建动态sql,由于我正在阅读的数据库的技术性而与问题无关,因此完全是必要的。 (它是专有系统的后端。有7千多个表)。
答案 0 :(得分:0)
我应该使用线程或异步代理吗?
显然,您的后台线程操作跨越单个HTTP请求的边界。在这种情况下,用于运行此类操作的API并不重要:Task.Run
,Delegate.BeginInvoke
,ThreadPool.QueueUserWorkItem
,new Thread
或其他任何内容。
您不应该在ASP.NET地址空间内运行冗长的后台线程操作,该操作的生命周期跨越多个HTTP请求。虽然它相对容易实现,但这种方法可能存在IIS可维护性,可伸缩性和安全性方面的问题。为此创建一个WCF服务并从ASP.NET页面调用它:
答案 1 :(得分:0)
如果我们从服务于http请求的线程在ASP.Net中启动一个新线程,并且新线程有一个未处理的异常,则工作进程将立即崩溃。即使我们使用WCF服务并从ASP.Net调用它,ASP.Net线程也会等待结果。因此,最好使用任何排队机制,以便请求在队列中,队列可以根据处理能力在不同的时间处理。当然,当我们说排队时,我们需要考虑队列故障,重新排队等......但是如果应用程序很大并且需要扩展它的价值。