多线程:启动一个线程执行查询,而另一个进程继续运行
本文关键字:查询 另一个 进程 运行 继续 执行 线程 启动 一个 多线程 | 更新日期: 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,则需要通过Invoke
或BeginInvoke
访问UI控件。