小编Ele*_*tik的帖子

.NET垃圾收集器之谜

在我的工作中,我们遇到了OutOfMemoryExceptions的问题.我写了一段简单的代码来模仿一些行为,我最终得到了以下谜团.看看这个简单的代码,它在内存耗尽时会爆炸.

class Program
{
    private static void Main()
    {
        List<byte[]> list = new List<byte[]>(200000);
        int iter = 0;

        try
        {
            for (;;iter++)
            {
                list.Add(new byte[10000]);
            }
        }
        catch (OutOfMemoryException)
        {
            Console.WriteLine("Iterations: " + iter);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,它结束了

Iterations: 148008

然后我GC.Collect在每千次迭代后添加了对循环的调用:

            //...
            for (;;iter++)
            {
                list.Add(new byte[10000]);

                if (iter % 1000 == 0)
                    GC.Collect();
            }
            //...
Run Code Online (Sandbox Code Playgroud)

并且惊喜:

Iterations: 172048

当我GC.Collect每10次迭代后调用时,我甚至得到了193716次循环.有两件奇怪的事情:

  1. 手动呼叫如何GC.Collect产生如此严重的影响(分配多达30%)?

  2. 当没有"丢失"参考时(我甚至预设了List的容量),GC可以收集什么?

.net c# garbage-collection

28
推荐指数
2
解决办法
1921
查看次数

如何从WebRequest中删除代理并保持DefaultWebProxy不变

我使用FtpWebRequest做一些FTP的东西,我需要直接连接(没有代理).但是WebRequest.DefaultWebProxy包含IE代理设置(我估计).

WebRequest request = WebRequest.Create("ftp://someftpserver/");
// request.Proxy is null here so setting it to null does not have any effect
WebResponse response = request.GetResponse();
// connects using WebRequest.DefaultWebProxy
Run Code Online (Sandbox Code Playgroud)

我的代码是一个巨大的应用程序中的一块,我不想改变,WebRequest.DefaultWebProxy因为它是全局静态属性,它可能会对应用程序的其他部分产生负面影响.

知道怎么做吗?

.net c#

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

在SqlBulkCopy中使用NHibernate事务

我正在使用NHibernate存储一些数据,我需要插入大量数据作为此操作的一部分 - 即在同一事务中.代码如下所示:

using (ISession session = NHibernateHelper.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
    session.SaveOrUpdate(something);
    // ...


    SqlBulkCopy bulkCopy = new SqlBulkCopy(
    (SqlConnection)session.Connection,
    SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers,
    ???transaction???
    );
    //...

    transaction.Commit();
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用TransactionScope或以其他方式使用它.但我坚持这种模式.让我们假装为了独立的DB访问(如果我提取并注入任意批量插入操作).有没有办法让SqlTransaction实例出来NHibernate.ITransaction

谢谢

c# sql-server nhibernate ado.net transactions

15
推荐指数
1
解决办法
4987
查看次数

fsc.exe非常慢,因为它试图访问crl.microsoft.com

当我在我们的构建服务器上运行F#compiler - fsc.exe时,即使没有输入文件也需要很长时间(~20秒)才能运行.经过一番调查后,我发现这是因为应用程序试图访问crl.microsoft.com(可能是为了检查某些证书是否未被撤销).但是,运行它的帐户无法访问Internet.而且因为我们的路由器/防火墙/无论什么只是丢弃SYN数据包,fsc.exe在放弃之前会多次尝试.

想到的唯一解决方案是在主机文件中将clr.microsoft.com设置为127.0.0.1,但这是非常讨厌的解决方案.而且,我需要在我们的生产盒上使用fsc.exe,在那里我不能做这些事情.还有其他想法吗?

谢谢

networking f#

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

F#/ .NET null实例奇怪

我有这个C#DLL:

namespace TestCSProject
{
    public class TestClass
    {
        public static TestClass Instance = null;

        public int Add(int a, int b)
        {
            if (this == null)
                Console.WriteLine("this is null");
            return a + b;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个引用DLL的F#app:

open TestCSProject
printfn "%d" (TestClass.Instance.Add(10,20))
Run Code Online (Sandbox Code Playgroud)

没有人启动Instance静态变量.猜猜F#app的输出是什么?

this is null
30
Press any key to continue . . .

经过几次测试后我发现除非我使用this(例如访问实例字段),否则我不会得到NullReferenceExpcetion.

这是F#编译/ CLR中的预期行为还是差距?

.net c# f#

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

在.NET COM互操作中传递强类型参数

我有两个通过COM互操作公开的.NET类 - 让我们说Foo和Bar,我需要将类型为Foo的参数传递给Bar中定义的方法.像这样的东西:

[ComVisible(true)]
public class Foo
{
    // whatever
}

[ComVisible(true)]
public class Bar
{
    public void Method(Foo fff)
    {
        // do something with fff
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行以下VBS(使用cscript.exe)时:

set foo = CreateObject("TestCSProject.Foo")
set bar = CreateObject("TestCSProject.Bar")
call bar.Method(foo)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

D:\test.vbs(3, 1) Microsoft VBScript runtime error: Invalid procedure call or argument: 'bar.Method'

但是,如果我将Method声明更改为:

    public void Method(object o)
    {
        Foo fff = (Foo)o;
        // do something with fff
    }
Run Code Online (Sandbox Code Playgroud)

一切正常.我尝试了一些关于界面,属性等的魔法,但到目前为止还没有运气.

任何见解?

非常感谢

.net c# com com-interop

6
推荐指数
1
解决办法
2453
查看次数

什么是默认的msbuild平台

如果没有指定,msbuild如何选择平台?在我看来,对于某些解决方案,它为其他"x86"选择"混合平台".

我打开了日志记录的诊断级别,我唯一能看到的是开头的"初始属性"包含例如"平台=混合平台"而没有任何解释原因.

为了抢占一些答案,我知道我可以手动覆盖平台.这不是问题.我需要知道msbuild在未指定时执行的操作.

msbuild

6
推荐指数
2
解决办法
3734
查看次数

如何异步打开Windows中的文件

有没有办法在Windows中异步打开文件?CreateFile API函数只有FILE_FLAG_OVERLAPPED,允许进一步的异步读写.尽管如此,文件的打开似乎是同步的.鉴于,它必须访问文件系统(并可能执行昂贵的IO操作),它可能是一个潜在的阻止程序.

这实际上是一个潜在的问题,是否可以异步打开.NET中的文件(因为无法等待FileStream ctor).但如果在操作系统中无法做到这一点,问题就毫无意义.

.net windows winapi asynchronous file

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