为每个SQL查询记录

时间:2015-11-10 12:46:43

标签: c# multithreading

我是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部分应该传递什么?

3 个答案:

答案 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);
    }