Tag: .net 4.0

什么时候.NET Monitor完全进入内核模式?

我想编译一个列表,列出所有可能的条件,使Monitor转到内核模式/使用内核同步对象。 同步块有一个引用内核对象的字段,因此我推断lock将在某个时候进入内核模式。 我发现了这一点: .NET中的Lock(Monitor)内部实现 但它有太多的问题无法回答,唯一有用的信息是OP通过简单地说明lock将在某个时候进入内核模式来回答他自己的问题。 此外,没有任何链接可以支持该答案。 我的问题是不同的 – 我想知道什么时候确切的lock将进入内核模式 (不是,如果不是为什么 – 何时)。 如果与旧版本有任何不同,我更感兴趣的是听到.NET 4和4.5 编辑:从里希特书中:“同步块包含内核对象的字段,拥有线程的ID,递归计数和等待的线程计数。”

如何动态扩展内存映射文件

我已经使用C#来解决后续需求。 – 创建一个可以快速收集大量数据的应用程序 – 您必须能够分析收到的数据,同时还要收到更多数据。 – 使用尽可能小的CPU和光盘 我对算法的想法是…… SIZE = 10MB Create a mmf with the size of SIZE On data recived: if data can’t fit mmf: increase mmf.size by SIZE write the data to mmf – >当使用前一个“房间/空间”时,光盘上的大小增加了10MB的块。 如何在C#中“通过SIZE增加mmf.size”? 我已经找到了很多关于创建mmfs和视图的简单示例,但是我看到的唯一的地方( 链接 )实际上增加了mmfs区域的代码使用了无法编译的代码。 任何帮助都会受到很大的关注。 编辑这会导致exception: private void IncreaseFileSize() { int theNewMax = this.currentMax + INCREMENT_SIZE; this.currentMax […]

最佳实践LongRunning任务创建

对于需要使用.Net 4中的Task API运行的后台线程,这是一个很好的设计吗? 我唯一担心的是,如果我们要取消该任务,我将如何做到这一点? 我知道我可以将ProgramEnding设置为true但我知道Task API中有一个CancellationToken 。 这只是一个示例代码示例,以便一个线程将添加到集合中,另一个线程将从中删除。 任务设置为LongRunning,因为这需要在程序运行时连续运行 private void RemoveFromBlockingCollection() { while (!ProgramEnding) { foreach (var x in DataInQueue.GetConsumingEnumerable()) { Console.WriteLine(“Task={0}, obj={1}, Thread={2}” , Task.CurrentId, x + ” Removed” , Thread.CurrentThread.ManagedThreadId); } } } private void button1_Click(object sender, EventArgs e) { DataInQueue = new BlockingCollection(); var t9 = Task.Factory.StartNew(RemoveFromBlockingCollection , TaskCreationOptions.LongRunning); for (int […]

c#打印机属性WMI

你好我有这个代码来检索打印机属性: string printerName = “PrinterName”; string query = string.Format(“SELECT * from Win32_Printer ” + “WHERE Name LIKE ‘%{0}'”, printerName); ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); ManagementObjectCollection coll = searcher.Get(); foreach (ManagementObject printer in coll) { foreach (PropertyData property in printer.Properties) { Console.WriteLine(string.Format(“{0}: {1}”, property.Name, property.Value)); } } 但我需要的属性总是返回相同的: PrinterState:0 PrinterStatus:3 基本上我需要这个来检查打印机是否缺纸。 我认为会是:PrinterState:4 在wxp-86和w7-64上测试返回相同的.Net 4.0 谢谢。

如何调试托管堆中的损坏

我的程序抛出一个错误,它无法通过catch(Exception e)块处理,然后崩溃: 访问冲突损坏的状态exception。 这是奇怪的事情,因为,正如我所知,从非托管代码抛出损坏的状态exception,而在这里我在调用StringBuilder方法时得到此exception。 代码在后台线程中运行并且不时崩溃,这是不容易再现的。 所以我将WinDbg附加到进程并具有以下exception堆栈: 000000001dabd8c8 000007feea129a1d [HelperMethodFrame: 000000001dabd8c8] 000000001dabda00 000007fee90cfce8 System.Text.StringBuilder.ExpandByABlock(Int32) 000000001dabda40 000007fee90cfba4 System.Text.StringBuilder.Append(Char*, Int32) 000000001dabdaa0 000007fee9102955 System.Text.StringBuilder.Append(System.String, Int32, Int32) 000000001dabdaf0 000007ff00bf5ce3 MineUtils.Common.Strings.Strings.Replace(System.String, System.String, System.String, Boolean, Boolean) 000000001dabdb90 000007ff00bf5a59 MineUtils.Common.Strings.Strings.RemoveSubstrings(System.String, System.String, System.String, Boolean) [D:\Programs\Visual Studio 2005 Projects\MineUtils.Common\Strings\Strings.Common-Main.cs @ 1481 WinDbg显示发生此exception: EXCEPTION_RECORD: ffffffffffffffff — (.exr 0xffffffffffffffff) ExceptionAddress: 000007feea129a1d (clr!WKS::gc_heap::find_first_object+0x0000000000000092) ExceptionCode: c0000005 (Access violation) ExceptionFlags: […]

易失性与易失性读/写?

我找不到任何 VolatileRead / write(尝试…)的例子,但仍然: 我什么时候应该使用volatile vs VolatileRead ? AFAIK volatile的全部目的是创造半围栏所以: 对于READ操作,在当前操作之后进行的读/写(在其他线程上)将不会在栅栏之前传递。 因此 – 我们读了最新的价值。 问题#1 那我为什么需要volatileRead呢? 似乎volatile已经完成了工作。 另外 – 在C#中, 所有写入都是易失性的 (与Java中不同),无论您是写入volatile还是非易失性字段 – 所以我问:为什么我需要volatileWrite ? 问题2 这是VolatileRead的实现: [MethodImpl(MethodImplOptions.NoInlining)] public static int VolatileRead(ref int address) { int num = address; MemoryBarrier(); return num; } 为什么行int num = address; 在那儿? 他们已经有了明确保持价值的地址参数。

如何使用Xpath在C#中读取XML

我有这个XML 2/28/2012 5:28:05 PM S200 N82E16834230265 X54C-NS92 true newegg.com 439.99 0.00 USD 如何使用XPath读取节点? 以上XML的XNamespace是什么?

为异步执行排队操作/代理

框架中是否有某些东西允许我异步执行委托队列? 我的意思是我希望代表按照排队的顺序一次执行一个但我希望整个过程以异步方式运行。 队列也不固定,会定期添加其他委托,并且一旦到达队列顶部就应该处理。 我不需要特别使用Queue ,这就是我如何描述所需的行为。 我可以自己写一些东西去做,但如果有内置的东西,我可以使用,而不是更好。 我简要地查看了ThreadPool.QueueUserWorkItem因为它允许按顺序执行,但是可以找到一种令人满意的方法来防止一次执行多个执行。

条件编译和框架目标

如果目标框架是较新的版本,那么我的项目代码可能会有一些小的地方可以大大改进。 我希望能够更好地利用C#中的条件编译来根据需要切换它们。 就像是: #if NET40 using FooXX = Foo40; #elif NET35 using FooXX = Foo35; #else NET20 using FooXX = Foo20; #endif 这些符号中的任何一个都是免费的吗? 我是否需要将这些符号作为项目配置的一部分注入? 似乎很容易做到,因为我知道哪个框架是MSBuild的目标。 /p:DefineConstants=”NET40″ 更新:我的问题是人们如何处理这种情况? 你在创造不同的配置吗? 您是否通过命令行传递常量?

读取大TXT文件,内存不足exception

我想读大TXT文件大小是500 MB,首先我使用 var file = new StreamReader(_filePath).ReadToEnd(); var lines = file.Split(new[] { ‘\n’ }); 但它抛出内存exception然后我试图逐行读取但是在读取大约150万行之后再次抛出内存exception using (StreamReader r = new StreamReader(_filePath)) { while ((line = r.ReadLine()) != null) _lines.Add(line); } 或者我用过 foreach (var l in File.ReadLines(_filePath)) { _lines.Add(l); } 但我又收到了 mscorlib.dll中出现“System.OutOfMemoryException”类型的exception,但未在用户代码中处理 我的机器是function强大的机器,有8GB的内存,所以它不应该是我的机器问题。 ps:我试图在NotePadd ++中打开这个文件,我收到’文件太大而无法打开’exception。