我是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
部分应该传递什么?
答案 0 :(得分:4)
最直接的解决方案是使用并行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:
执行foreach(For Basic中的For Each)操作 IEnumerable,其中迭代可以并行运行。
对源枚举中的每个元素调用一次body委托。它以当前元素作为参数提供。
https://msdn.microsoft.com/en-us/library/dd992001(v=vs.110).aspx
并非每个操作可以在另一个线程上运行。某些元素可能在同一个线程上执行其处理程序。 Task
框架将根据目标系统优化以获得最佳吞吐量。您可能需要更多控制权。
答案 1 :(得分:1)
一般而言,这里最简单的技巧是匿名方法,例如:
Thread thread = new Thread(() => u.DoSomething("abc", 123));
但根据我的评论 - 这几乎肯定是一个坏主意,而不是你应该做的事情。 “每个用户的线程”本身就足以让我畏缩。
答案 2 :(得分:0)
最简单也可能是最好的选择是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);
}