为每个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部分应该通过哪些内容?

为每个SQL查询记录创建线程

最直接的解决方案是使用并行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);
    }