小编Man*_*rin的帖子

XDocument + IEnumerable导致System.Xml.Linq.dll中出现内存不足异常

基本上我有一个程序,当它开始加载文件列表(as FileInfo)时,对于列表中的每个文件,它加载一个XML文档(如XDocument).

然后程序将数据从其中读取到容器类(存储为IEnumerables),此时XDocument超出范围.

然后程序将数据从容器类导出到数据库.导出后容器类超出范围,然而,垃圾收集器没有清理容器类,因为它的存储IEnumerable,似乎导致XDocument留在内存中(不确定这是否是原因,但任务经理正在显示XDocument未被释放的记忆.

当程序循环遍历多个文件时,程序最终会抛出一个内存不足的异常.为了减轻这种情况,我最终使用了

System.GC.Collect(); 
Run Code Online (Sandbox Code Playgroud)

在容器超出范围后强制垃圾收集器运行.这是有效的,但我的问题是:

  • 这是正确的做法吗?(强制垃圾收集器运行似乎有点奇怪)
  • 有没有更好的方法来确保处理XDocument内存?
  • 可能有一个不同的原因,除了IEnumerable,文件内存没有被释放?

谢谢.


编辑:代码示例:

  • 集装箱类:

    public IEnumerable<CustomClassOne> CustomClassOne { get; set; }
    public IEnumerable<CustomClassTwo> CustomClassTwo { get; set; }
    public IEnumerable<CustomClassThree> CustomClassThree { get; set; }
    ...
    public IEnumerable<CustomClassNine> CustomClassNine { get; set; }
    
    Run Code Online (Sandbox Code Playgroud)
  • 自定义类:

    public long VariableOne { get; set; }
    public int VariableTwo { get; set; }
    public DateTime VariableThree { get; set; } …
    Run Code Online (Sandbox Code Playgroud)

c# linq garbage-collection out-of-memory linq-to-xml

13
推荐指数
2
解决办法
5597
查看次数

合并多个更新和插入

基本上我有一个SQL Server 2008 R2数据库.该数据库有一个名为Node和Link的表.链接包含与节点中的Id相关的StartNodeId和EndNodeId.数据库还需要节点和链接之间的链接表,以便更快地检查说明,此节点是否与此链接相关或哪些节点与此链接相关.Link表包含Identity密钥,NodeId和LinkId.我的问题是当我正在进行插入操作时,我正在尝试使用合并语句,这些语句似乎无法完成我正在尝试的操作

当我尝试

MERGE INTO [RoadRoutingDatabase].[dbo].[NodeToLink] AS TARGET
USING (SELECT Id, StartNodeId, EndNodeId FROM [RoadRoutingDatabase].[dbo].[Link]) AS SOURCE
ON (TARGET.LinkId = SOURCE.Id)
WHEN MATCHED AND TARGET.NodeId = Source.StartNodeId THEN
    UPDATE SET TARGET.NodeId = SOURCE.StartNodeId,
               TARGET.LinkId = SOURCE.Id
WHEN MATCHED AND TARGET.NodeId = Source.EndNodeId THEN
    UPDATE SET TARGET.NodeId = SOURCE.EndNodeId,
               TARGET.LinkId = SOURCE.Id
WHEN NOT MATCHED BY TARGET AND TARGET.NodeId = Source.StartNodeId THEN
    INSERT (LinkId, NodeId)
    VALUES (SOURCE.Id, SOURCE.StartNodeId)
WHEN NOT MATCHED BY TARGET AND TARGET.NodeId = Source.EndNodeId THEN
    INSERT …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server merge sql-server-2008

9
推荐指数
1
解决办法
4万
查看次数

空引用检查的好习惯是什么?

检查对象上的空引用的最有效方法是什么?我看过各种代码示例,它们有不同的检查方式,以便最有效或者被认为是最佳实践使用的方法如下:

Object.ReferenceEquals(item, null)

item == null

item != null

Object.Equals(item, null)
Run Code Online (Sandbox Code Playgroud)

谢谢

c# performance

9
推荐指数
3
解决办法
2万
查看次数

使用LINQ检查数据库中是否存在表

我们有一个已部署到各种客户端的数据库.我们目前正在引入一个可选的新功能,该功能将要求希望该功能的客户将新表添加到现有数据库中.

正在我们推出一款新软件,无论是否有新表,都必须与数据库版本进行交互(因为我们不希望有2个版本用于拥有新表的客户和一个用于不是)我们想知道是否有可能以编程方式确定(使用实体框架)数据库中是否存在表(我可以尝试访问该表并让它抛出异常但是想知道是否有内置函数去做这个)

谢谢

编辑:鉴于人们告诉我我应该使用配置文件不检查EF,任何人都可以指导我如何检查配置文件,例如,mvc控制器的自定义数据注释.就像是:

[Boolean(Properties.Settings.Default.TableExists)]
public class NamedController : Controller
Run Code Online (Sandbox Code Playgroud)

如果错误,会抛出未找到的页面?

编辑2:根据人们给出的建议使用配置设置,我最终得到了以下解决方案

用于设置表是否存在的应用程序设置

<appSettings>
    <add key="tableExists" value="True"/>
</appSettings>
Run Code Online (Sandbox Code Playgroud)

自定义数据注释,以说明是否允许访问控制器

[AuthoriseIfTableExistsIsTrue]
public class NamedController : Controller
Run Code Online (Sandbox Code Playgroud)

自定义授权的代码

public class AuthoriseIfTableExistsIsTrue : AuthorizeAttribute
{
    private readonly bool _tableExists;

    public AuthoriseIfTableExistsIsTrue()
    {
        _tableExists = string.Equals(bool.TrueString, ConfigurationManager.AppSettings["tableExists"], StringComparison.InvariantCultureIgnoreCase);
    }

    public AuthoriseIfTableExistsIsTrue(bool authorise)
    {
        _tableExists = authorise;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (_tableExists)
            return base.AuthorizeCore(httpContext);
        else
            throw new HttpException(404, "HTTP/1.1 404 Not Found");
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢大家的帮助,并告诉我不要使用EF,而是使用配置设置

c# linq asp.net-mvc entity-framework

5
推荐指数
1
解决办法
8887
查看次数

有关char指针类型的C函数的问题,有人可以解释一下吗?

有人可以帮我找到这个C函数中的错误吗?

    char* f(int i) {
            int i; 
            char buffer[20];
            switch ( i ) {
                    1: strcpy( buffer, "string1");
                    2: strcpy( buffer, "string2");
                    3: strcpy( buffer, "string3");
                    default: 
                    strcpy(buffer, "defaultstring");
            }
            return buffer;
    }
Run Code Online (Sandbox Code Playgroud)

我认为这与类型转换有关.我的编译器发出警告'int i的声明阴影参数'.

c

4
推荐指数
2
解决办法
620
查看次数

Linq.除了函数"至少有一个对象必须实现IComparable."

基本上我有一个实现IEquatable的容器(示例如下所示)

public class ContainerClass  : IEquatable<ContainerClass>
{
        public IEnumerable<CustomClass> CustomClass { get; set; }

        public override bool Equals(object obj) { ... }
        public bool Equals(ContainerClass other) { ... }
        public static bool operator ==(ContainerClass cc1, ContainerClass cc2) { ... }
        public static bool operator !=(ContainerClass cc1, ContainerClass cc2) { ... }
        public override int GetHashCode() { ... }
}
Run Code Online (Sandbox Code Playgroud)

以及一个也实现IEquatable的CustomClass

public class CustomClass : IEquatable<CustomClass>
{
        public string stringone { get; set; }
        public string stringtwo { get; set; } …
Run Code Online (Sandbox Code Playgroud)

c# linq iequatable

4
推荐指数
1
解决办法
2万
查看次数

LINQ过去12个月

我怎么拉

最近12个(月)记录按ServiceId过滤,按最近排序

使用linq给出这个db表数据:

 - Date         ServiceId     Views     Clicks
 - 2009-03-01       3         88107     244223
 - 2009-03-01       5         41563     94770
 - 2009-03-01       7         24165     45378
 - 2009-03-01       8         16415     24311
 - 2009-03-01       4         50341     127114
 - 2009-04-01       3         70646     211999
 - 2009-04-01       5         40380     102241
 - 2009-04-01       7         23905     40768
 - 2009-04-01       8         18996     29220
 - 2009-04-01       4         45685     112635
 - 2009-05-01       3         81044     215753
 - 2009-05-01       5         46273     121343
 - 2009-05-01       7         25744     41578
 - 2009-05-01       8         21122     32607
 - 2009-05-01 …
Run Code Online (Sandbox Code Playgroud)

linq asp.net asp.net-mvc

4
推荐指数
1
解决办法
5062
查看次数

帮助克隆方法

我几乎完成了这个项目,涉及在Celsius,Fahrenheit和Kelvin之间转换,我最后需要的是找出克隆方法.任务是"clone,它不接受任何形式参数,并返回对新创建的Temperature对象的引用,该对象具有与其作为克隆的对象相同的值和比例".我的代码编译,但在客户端程序中运行时,我在Temperature.clone(Temperature.java:134)收到java.lang.StackOverflowError的错误

public class Temperature {
    private double value;
    private String scale;

    public Temperature() { // default constructor 
        this.value = 0;
        this.scale = "C";
    }

    public Temperature(double value, String scale) {
        this.value = value;
        this.scale = scale;
    }

    public double getValue() {
        return this.value;
    }

    public String getScale() {
        return this.scale;
    }

    public double getCelsius() {

        if (scale.equalsIgnoreCase("C")) {
            return this.value;
        } else if (scale.equalsIgnoreCase("F")) {
            double faren = ((this.value - 32) * (5 / …
Run Code Online (Sandbox Code Playgroud)

java

4
推荐指数
1
解决办法
321
查看次数

Parallel.ForEach x of x

所以我在c#4.0 WPF应用程序中工作并使用并行foreach循环使用我创建的数据库存储库将数据导出到数据库.我已经使用进度条使用并行foreach进行导出,但是希望能够提供更多深入的进度细节,例如导出第25项的第5项.我遇到的问题很明显,因为它正在运行与此同时,计数器不起作用,即总数会说出类似的结果

exporting 0 of 25
exporting 0 of 25
...
exporting 5 of 25
exporting 5 of 25
Run Code Online (Sandbox Code Playgroud)

任何人都可以指导如何在这样的并行循环中使行为工作:

int runningTotal = 0;
Parallel.ForEach(source, x =>
{
    Repository.Commit(x);
    runningTotal++;
    progressReporter.ReportProgress(() =>
    {
        //Progress bar update
        this.progressFile.Value++;
        this.lblProgress.Text = String
            .Format("Exporting Source {0} of {1}", runningTotal, source.Count)
    });
});
Run Code Online (Sandbox Code Playgroud)

希望这表明我希望实现的目标.

谢谢

c# parallel-processing wpf

3
推荐指数
1
解决办法
2987
查看次数

MVC DropDownListFor值不能为空

我有代码:

<%: Html.DropDownListFor(
       model => model.CompanyName, 
       new SelectList(ViewData["ActiveCompanies"] as IEnumerable, 
       "Id", "Name"))
%>
Run Code Online (Sandbox Code Playgroud)

正在使用名称等填充列表,但所选项目名称未绑定到Model.CompanyName(如果解决方案返回id,那么我可以使用类似的东西

<%: Html.DropDownListFor(
        model => model.CompanyID, 
        new SelectList(ViewData["ActiveCompanies"] as IEnumerable, 
        "Id", "Name"))
 %>
Run Code Online (Sandbox Code Playgroud)

事实上,这对我的目的来说会更好,但如果我能找出数据未被约束的原因,那将会非常有用.

c# linq asp.net-mvc-2

2
推荐指数
1
解决办法
1万
查看次数

如何在此代码中阻止NullPointerException?

当我按下STime等于的JOptionPane.showInputDialog窗口上的取消按钮时,如何在此代码中阻止NullPointerException?(它位于'>>'标志)

我的代码:

insertTableF.addActionListener(new ActionListener () { 
    public void actionPerformed(ActionEvent  e)
    {
        int wayPoint1 = 0;
        int wayPoint2 = 0;
        int PassTime = 0;
        Statement statementR;

        if (loggedIn == 1)
        {

            while(passedR ==0) 
            {
                try 
                {
                    if (wayPoint1==0) 
                    {
                        sTagR =JOptionPane.showInputDialog("Please enter the Rhino Tag number:");
                        iTagR = Integer.parseInt(sTagR);
                        wayPoint1 =1;
                    }
                    if (wayPoint2==0) 
                    {
                        sGPSX = JOptionPane.showInputDialog("Please enter the horizontal GPS Grid Numbers(eg.3123):");
                        iGPS = Integer.parseInt(sGPSX);

                        wayPoint2 = 1;
                    }

                    sGPSY = JOptionPane.showInputDialog("Please enter the vertical GPS Grid Letters(eg.XXYY:");
                    while …
Run Code Online (Sandbox Code Playgroud)

java sql database formatting nullpointerexception

0
推荐指数
1
解决办法
1822
查看次数