在我的工作中,我们遇到了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次循环.有两件奇怪的事情:
手动呼叫如何GC.Collect产生如此严重的影响(分配多达30%)?
当没有"丢失"参考时(我甚至预设了List的容量),GC可以收集什么?
我使用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因为它是全局静态属性,它可能会对应用程序的其他部分产生负面影响.
知道怎么做吗?
我正在使用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?
谢谢
当我在我们的构建服务器上运行F#compiler - fsc.exe时,即使没有输入文件也需要很长时间(~20秒)才能运行.经过一番调查后,我发现这是因为应用程序试图访问crl.microsoft.com(可能是为了检查某些证书是否未被撤销).但是,运行它的帐户无法访问Internet.而且因为我们的路由器/防火墙/无论什么只是丢弃SYN数据包,fsc.exe在放弃之前会多次尝试.
想到的唯一解决方案是在主机文件中将clr.microsoft.com设置为127.0.0.1,但这是非常讨厌的解决方案.而且,我需要在我们的生产盒上使用fsc.exe,在那里我不能做这些事情.还有其他想法吗?
谢谢
我有这个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中的预期行为还是差距?
我有两个通过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)
一切正常.我尝试了一些关于界面,属性等的魔法,但到目前为止还没有运气.
任何见解?
非常感谢
如果没有指定,msbuild如何选择平台?在我看来,对于某些解决方案,它为其他"x86"选择"混合平台".
我打开了日志记录的诊断级别,我唯一能看到的是开头的"初始属性"包含例如"平台=混合平台"而没有任何解释原因.
为了抢占一些答案,我知道我可以手动覆盖平台.这不是问题.我需要知道msbuild在未指定时执行的操作.
有没有办法在Windows中异步打开文件?CreateFile API函数只有FILE_FLAG_OVERLAPPED,允许进一步的异步读写.尽管如此,文件的打开似乎是同步的.鉴于,它必须访问文件系统(并可能执行昂贵的IO操作),它可能是一个潜在的阻止程序.
这实际上是一个潜在的问题,是否可以异步打开.NET中的文件(因为无法等待FileStream ctor).但如果在操作系统中无法做到这一点,问题就毫无意义.
.net ×5
c# ×5
f# ×2
ado.net ×1
asynchronous ×1
com ×1
com-interop ×1
file ×1
msbuild ×1
networking ×1
nhibernate ×1
sql-server ×1
transactions ×1
winapi ×1
windows ×1