1

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

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

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

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

谢谢。

4

3 回答 3

3

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

Task.Factory.StartNew(() => x.ExecuteQuery());
于 2013-02-21T01:11:39.083 回答
2

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

public void SomeMethod()
{
    foreach (SomeModel x in TheListOfSomeModel)
    {
        var model = x;
        //do some work
        ....
        if (SomeCondition)
        {
             Task.Factory.StartNew(() => model.ExecuteQuery());
        }
    }
}
于 2013-02-21T01:16:05.817 回答
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,那么您需要通过Invoke或访问 UI 控件BeginInvoke

于 2013-02-21T01:17:11.363 回答