为SQL Server填充的多个下拉框创建线程或并行编程
本文关键字:创建 线程 编程 并行 Server SQL 填充 | 更新日期: 2023-09-27 18:28:41
所以我有一个带有扩展方法的poco类,它填充了一个选择列表,如下所示。假设我有10个下拉框,每个扩展方法都进入数据库并填充SelectList。现在我想把每个方法都作为一个线程来启动,这是个好主意吗。。。。我正在寻求能更好地提高性能和速度的建议和事情。线程是否比sql连接更昂贵?我应该每个线程运行两个进程吗,三个、四个。。。?
class person
{
public person()
{
CrimesListbox1 = CrimesListBox1.populate();
CrimesListBox2 = CrimesListBox1.populate();
CrimesListBox3 = CrimesListBox1.populate();
//so instead of the above way should i..... do the following?
Thread t = new Thread (this.CrimesListBox1.populate()); // Kick off a new thread
t.Start();
Thread t2 = new Thread (this.CrimesListBox2.populate());
t2.Start();
}
public SelectList CrimesListBox1{get;set}
public SelectList CrimesListBox2{get;set}
public static SelectList populate(this SelectList Object)
{
CrimesDataContext LinqCtx = new CrimesDataContext ();
var CrimesListBox1=
(
from x in LinqCtx.CrimesListBox1
orderby x.Crimes
select x
);
Object=
new SelectList
(
CrimesListBox1, "CrimeId", "CrimeName"
);
return Object;
}
}//end of the person class
现在我想把每个方法都作为一个线程来启动,这是个好主意吗。。。。
没有。这是一个以"S"开头,以"D"结尾,有4个字母的想法。
线程有开销。让我们进入要点:
- 使用任何形式的异步编程都可能没有什么意义——因为框很长,所以不会导致潜在的差异
- 不过,如果是这样的话,可能会有好处。但是,使用单独的线程几乎不了解.NET框架
解决方案:
- 对于当前的.NET,请使用TASKS。Tasks框架就是这样做的
- 对于.NET 4.5,请使用异步方法
这些线程在内部使用一个线程池,所以它们不会为每个小请求打开另一个线程,而是在被分配这些小任务时保留一个工作线程池。因为创建和销毁线程有一个不平凡的开销。ThreadPool(.net 4.0之前的解决方案)、任务框架和下一个版本中的异步方法都非常适合不必处理这些项目。任务已经足够好了,现在可以使用了。
为此目的使用线程是个坏主意。考虑一下这个经验法则。在竞争同一资源时不要使用线程。资源可以是磁盘、数据库、屏幕、用户界面。使用线程时,数据库不会变快,因为在同一资源上的工作量是相同的。
就像在单核上计算cpu繁重的计算一样,使用线程分割工作不会更快。就像从一个磁盘上读取多个文件一样,用线程分割工作不会更快。
这些示例使用单一的资源,cpu和磁盘,它们以最快的速度工作。
当您想要组合两种资源时,线程处理非常有用。在执行cpu计算时从磁盘读取,线程处理可以为计算等预取数据带来好处。
如果使用.Net 4.0或更高版本,则可以使用Parallel Linq(PLinq)。