我需要在C#中并行化这段代码。 listTipoGraficos
是一个ListView对象(我锁定了它的访问权限),但方法this.claseChartPadre.CargarGrafico
不是线程安全的。它只修改输入graficos[i]
,但它有很多局部变量,所以修改它是一个恐怖...我可以做任何事情而不适应它吗?
System.Collections.Concurrent.ConcurrentDictionary<int, Grafico> graficos = new System.Collections.Concurrent.ConcurrentDictionary<int,Grafico>();
for (int i = 0; i < listTipoGraficos.CheckedItems.Count; i++)
graficos[i] = (Grafico)listTipoGraficos.CheckedItems[i].Tag;
System.Threading.Tasks.Parallel.For(0,listTipoGraficos.CheckedItems.Count, i =>
{
//Controlamos que no lo tenemos ya cargado
if (graficos[i].EstaPintado == false || graficos[i].TipoFecha != fechaSelecionada || graficos[i].FechaIni != fechaIniSelec || graficos[i].FechaFin != fechaFinSelec)
{
graficos[i].TipoFecha = fechaSelecionada;
graficos[i].FechaIni = fechaIniSelec;
graficos[i].FechaFin = fechaFinSelec;
//Resetea el contenido del grafico
graficos[i].reiniciarContenido();
this.claseChartPadre.CargarGrafico(graficos[i]); // A lot of local variables inside
}
});
我无法发布很多代码,因为它不是我的。
public bool CargarGrafico(Grafico gf)
{
bool leido_ok = true;
// Reding from DB
ClaseComandoSql comando = new ClaseComandoSql();
comando.NombreComando = this.procedimiento;
comando.TipoComando = System.Data.CommandType.StoredProcedure;
comando.AñadirParametro("@CodGrafico", gf.CodGrafico);
comando.AñadirParametro("@Codigo", this.codigoObjeto);
comando.AñadirParametro("@CodOpcion", gf.TipoFecha);
comando.AñadirParametro("@FecInicial", gf.FechaIni);
comando.AñadirParametro("@FecFinal", gf.FechaFin);
System.Data.DataSet lector = comando.EjecutarLector(); // This is the operation I need to parallelize
bool primeraPasada = true;
bool codigoNulo = false;
int totalLeyendas = 0;
int totalAgrupaciones = 0;
String LeyendaAnterior = "";
int i = 0;
// Calculus and formatting
}
基本上,代码创建一个sql命令,执行它并格式化图形以绘制它。
编辑:我采用了这种方法,看起来效果很好,但我觉得它很难看。sync
是类中的实例变量。
public bool CargarGrafico(Grafico gf)
{
lock (sync)
{
bool leido_ok = true;
// Reding from DB
ClaseComandoSql comando = new ClaseComandoSql();
comando.NombreComando = this.procedimiento;
comando.TipoComando = System.Data.CommandType.StoredProcedure;
comando.AñadirParametro("@CodGrafico", gf.CodGrafico);
comando.AñadirParametro("@Codigo", this.codigoObjeto);
comando.AñadirParametro("@CodOpcion", gf.TipoFecha);
comando.AñadirParametro("@FecInicial", gf.FechaIni);
comando.AñadirParametro("@FecFinal", gf.FechaFin);
}
System.Data.DataSet lector = comando.EjecutarLector(); // This is the operation I need to parallelize
lock(sync)
{
bool primeraPasada = true;
bool codigoNulo = false;
int totalLeyendas = 0;
int totalAgrupaciones = 0;
String LeyendaAnterior = "";
int i = 0;
// Calculus and formatting
}