多线程:启动一个线程执行查询,而另一个进程继续运行

本文关键字:查询 另一个 进程 运行 继续 执行 线程 启动 一个 多线程 | 更新日期: 2023-09-27 18:00:17

我有一个看起来像这样的方法:

public void SomeMethod()
{
    foreach (SomeModel x in TheListOfSomeModel)
    {
        do some work
        ....
        if (SomeCondition)
        {
             x.ExecuteQuery();
        }
    }
}

基本上,SomeModel有一个运行更新查询的方法,该查询将对象的属性存储到数据库中的字段中。由于代码是当前编写的,如果需要运行查询,则整个循环将保持不变,直到查询完成。如果If有任何用处,那么TheListOfSomeModel中只有5个元素。

除了使用Parrallel ForEach,我如何更改它,使x.ExecuteQuery()在单独的线程上运行?

谢谢。

多线程:启动一个线程执行查询,而另一个进程继续运行

您可以将其作为这样的任务运行。。。

Task.Factory.StartNew(() => x.ExecuteQuery());

在生成任务/线程时要注意不要关闭循环变量(除非使用C#5),还要确保为每个线程使用单独的连接/上下文。

public void SomeMethod()
{
    foreach (SomeModel x in TheListOfSomeModel)
    {
        var model = x;
        //do some work
        ....
        if (SomeCondition)
        {
             Task.Factory.StartNew(() => model.ExecuteQuery());
        }
    }
}

为简洁起见,省略了异常处理:

using System.Threading.Tasks;    
....
public void SomeMethod()
{
    Task.Factory.StartNew(()=>
    {
        foreach (SomeModel x in TheListOfSomeModel)
        {
            //do some work
            ....
            if (SomeCondition)
            {
                 x.ExecuteQuery();
            }
         }
     });
}

这将在一个新线程中运行它。如果使用UI执行此操作,并且得到CrossThreadException,则需要通过InvokeBeginInvoke访问UI控件。