在多线程应用程序中正确管理DbContext

时间:2019-06-20 12:24:05

标签: c# multithreading dbcontext

我读到我不应该在多线程应用程序中使用相同的数据库上下文。

所以这是我的情况:我每年运行2个函数,每个函数根据行数多次调用子函数。

这里的目标是:如果有新记录,请将其添加到数据库中,否则更新记录的某些字段。

我要做的是:

1- import pandas as pd i=1 try: def fecth_details(category): global i list01=["orange", "apple", "bananna"] list02 = ["Tiger", "Hari", "Likun"] list03 = ["r1", "r2", "r3"] df1 = pd.DataFrame(list01, columns=["List of {}".format(category)]) df2 = pd.DataFrame(list02, columns=["List of {}".format(category)]) df3 = pd.DataFrame(list03, columns=["List of {}".format(category)]) writer = pd.ExcelWriter("output.xlsx") df1.to_excel(writer,startcol=i,sheet_name="sh1", index=False) df2.to_excel(writer,startcol=i, sheet_name="sh2", index=False) df3.to_excel(writer,startcol=i, sheet_name="sh3", index=False) writer.save() i+=1 except Exception as e: print("Error ::: {}".format(e)) category = ["fruits", "name", "rooms"] for i in range(len(category)): fecth_details( category[i]) 将所需的POCO类缓存到列表中。 (我之所以这样做,是因为我认为从缓存上下文中检查记录要比在dbcontext上多次使用linq更快。

2-我运行以下代码。在其中,我将数据与缓存的数据进行比较

await StaticSettings.CACHED_DATA.FillAll();

3-完成所有任务后,我打电话来保存更改并处置对象。

await GetAllData(cookie, datTypes.Select(x => x.DMT_CODE).ToList(), "me", year.Y_YEAR);
await GetAllData(cookie, datTypes.Select(x => x.DMT_CODE).ToList(), "they", year.Y_YEAR);

所以我想知道的是,我是否可以依靠此代码。

await StaticSettings.CACHED_DATA.ProcessTasks(); //Saves

更新

            Trace.WriteLine($@"Caching data");
            await StaticSettings.CACHED_DATA.FillAll();
            Trace.WriteLine($@"Caching done");

            var ts = years.Select(year => Task.Run(async () =>
                {
                    Trace.WriteLine($"Login Start {year.Y_YEAR}");
                    var cookie = await MahkemeWebUtils.ForceLoginWebClient(user.MU_USERNAME, user.MU_PASSWORD);
                    Trace.WriteLine($"Login End {year.Y_YEAR}");


                    await GetAllData(cookie, datTypes.Select(x => x.DMT_CODE).ToList(), "me", year.Y_YEAR);
                    await GetAllData(cookie, datTypes.Select(x => x.DMT_CODE).ToList(), "they", year.Y_YEAR);

                    //GC.Collect();
                }))
                .ToList();

            await Task.WhenAll(ts);
            await StaticSettings.CACHED_DATA.ProcessTasks(); //Saves 

0 个答案:

没有答案