我有一个看起来像这样的方法:
public void SomeMethod()
{
foreach (SomeModel x in TheListOfSomeModel)
{
do some work
....
if (SomeCondition)
{
x.ExecuteQuery();
}
}
}
基本上,SomeModel
有一个运行更新查询的方法,该查询将对象的属性存储到数据库的字段中。由于当前编写了代码,如果查询需要运行,整个循环将保持不变,直到查询完成。如果if可以有任何用途,TheListOfSomeModel
中只有5个元素。
除了使用Parrallel ForEach
之外,我如何更改它以便x.ExecuteQuery()
在单独的线程上运行?
感谢。
答案 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,则需要通过Invoke
或BeginInvoke
访问UI控件。