多线程:在另一个进程继续运行时启动一个线程来执行查询

时间:2013-02-21 01:01:38

标签: c#

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

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

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

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

感谢。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

为简洁起见,遗漏了异常处理:

using System.Threading.Tasks;    
....

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

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