为每个SQL查询记录创建线程
本文关键字:记录 创建 线程 查询 SQL | 更新日期: 2023-09-27 18:21:17
我是C#的新手,希望为数据库查询返回的每个记录启动一个线程。
目前我有以下方法:
myEntities getUsers = new myEntities();
var query = from userTable in getUsers.userTable
select userTable;
// FOR EACH USER CREATE NEW USER INSTANCE
foreach (userTable account in query)
{
User u = new User(account.userName, account.password);
}
我的目标是,为每个记录创建一个线程,然后在该线程内调用User方法。
我知道我应该使用System.Threading
命名空间,然后启动一个新线程来使用
Thread thread = new Thread(new ThreadStart(<WHAT GOES IN HERE>));
thread.Start();
ThreadStart
部分应该通过哪些内容?
最直接的解决方案是使用并行LINQ方法Parallel.ForEach
。
myEntities getUsers = new myEntities ();
var query = from userTable in getUsers.userTable
select userTable;
// FOR EACH LOGIN CREATE NEW TRADER INSTANCE
Parallel.ForEach(query, user =>
{
User u = new User(account.userName, account.password);
// call your method here!
});
来自MSDN:
对IEnumerable,其中迭代可以并行运行。
对于源枚举对象中的每个元素,都会调用一次主体委托。它提供了当前元素作为参数。
https://msdn.microsoft.com/en-us/library/dd992001(v=vs.110).aspx
并不是说的每个操作都可以在另一个线程上运行。某些元素的处理程序可能在同一个线程上执行。Task
框架将基于目标系统进行优化以获得最佳吞吐量。您可能需要更多的控制。
一般来说,这里最简单的技巧是匿名方法,例如:
Thread thread = new Thread(() => u.DoSomething("abc", 123));
但根据我的评论,这几乎肯定是一个坏主意,而不是你真正应该做的。"每个用户线程"本身就足以让我退缩。
最简单也是最好的选择是Parallel.ForEach.
public void MyMethod()
{
myEntities getUsers = new myEntities ();
var query = from userTable in getUsers.userTable
select userTable;
Parallel.ForEach(query, CreateUser);
}
private void CreateUser(userTable account)
{
new User(account.userName, account.password);
}