Tag: .net 4.0

.NET 4 ObjectCache – 我们可以陷入“缓存过期”事件吗?

我有一个像这样缓存的简单对象: _myCache.Add(someKey, someObj, policy); 其中_myCache被声明为ObjectCache (但通过DI注入为MemoryCache.Default ), someObj是我正在添加的对象,而policy是CacheItemPolicy 。 如果我有这样的CacheItemPolicy : var policy = new CacheItemPolicy { Priority = CacheItemPriority.Default, SlidingExpiration = TimeSpan.FromHours(1) }; 这意味着它将在1小时后到期。 凉。 但是会发生的事情是,一小时后不幸的第一个用户将不得不等待命中。 有什么方法可以挂钩到“过期”事件/委托并手动刷新缓存? 我看到有一个提到CacheEntryChangeMonitor但是在我的例子中找不到任何关于如何利用它的有意义的doco /例子。 PS。 我知道我可以使用CacheItemPriority.NotRemovable并手动过期,但我不能在我当前的例子中这样做,因为缓存的数据有点太复杂(例如,我需要在我的代码中的10个不同位置“无效” )。 有任何想法吗?

任务 vs c#中的异步委托?

我有这个简单的方法: static int Work (string s) { return s.Length; } 我可以运行它: Task task = Task.Factory.StartNew (() => Work (“lalala”) ); … int result = task.Result; 或者用这个: Func method = Work; IAsyncResult myIasync= method.BeginInvoke (“lalala”, null, null); … int result = method.EndInvoke (myIasync); 它们都使用线程池线程。 两者都等待执行完成(读取值时) 两者都重新抛出调用者的任何exception。 我应该何时使用?

正则表达式,匹配所有有效格式的IPv6地址

乍一看,我承认这个问题看起来像这个问题的副本以及与之相关的任何其他问题: 与有效IPv6地址匹配的正则表达式 事实上这个问题的答案几乎可以回答我的问题, 但并不完全。 我遇到的问题代码,但最成功的代码如下所示: private string RemoveIPv6(string sInput) { string pattern = @”(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))”; //That is one looooong regex! From: https://stackoverflow.com/a/17871737/3472690 //if (IsCompressedIPv6(sInput)) // sInput = UncompressIPv6(sInput); string output = Regex.Replace(sInput, pattern, “”); if (output.Contains(“Addresses”)) output = output.Substring(0, “Addresses: “.Length); return output; } 我在答案中提供的正则表达式模式的问题, David M. Syzdek的答案 ,是它不匹配并删除我正在抛出的IPv6地址的完整forms。 我正在使用正则表达式模式主要用空格或空值替换字符串中的IPv6地址。 例如, Addresses: 2404:6800:4003:c02::8a 以及… Addresses: 2404:6800:4003:804::200e […]

关闭.NET SerialPort后的ObjectDisposedExecption

我使用.NET 4 SerialPort对象与连接到COM1的设备进行通信。 当我完成设备后,我在SerialPort上调用Close。 我没有调用Dispose,但我相信Close和Dispose在这里是同义词。 通常这很好用。 但是,有时我会在一段时间后得到以下exception(我看过的时间范围从5毫秒到175毫秒): System.ObjectDisposedException:已关闭安全句柄 在System.Runtime.InteropServices.SafeHandle.DangerousAddRef(布尔和成功) 在System.StubHelpers.StubHelpers.SafeHandleAddRef(SafeHandle pHandle,布尔和成功) 在Microsoft.Win32.UnsafeNativeMethods.GetOverlappedResult(SafeFileHandle hFile,NativeOverlapped * lpOverlapped,Int32&lpNumberOfBytesTransferred,Boolean bWait) 在System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent() 在System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态,布尔ignoreSyncCtx) 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态) 在System.Threading.ThreadHelper.ThreadStart() 我的代码都没有在这个堆栈上。 我找到了http://blog.zachsaw.com/2010/07/serialport-ioexception-workaround-in-c.html ,但那里的解决方案没有用。 在进一步检查时,问题是IOException ,而不是ObjectDisposedException 。 关于拔掉USB到串口设备但是COM1在机上时观察到的问题,有很多post,所以它并没有意外消失。 这里的问题也不是我的问题; SerialPort在其使用期间保持活动状态,并且仅在我与设备通话时才关闭。 (一旦我完成,设备处于不会传输任何其他数据的状态。) SLaks 建议在SafeHandle.Dispose的入口处设置一个断点,以确定我何时处理我不应该的东西,但是我会破坏该断点数十次。 当我使用串行设备时,我单次调用SerialPort.Close调用了三次,其余大约一半都在GC线程中。 其余部分似乎与WPF UI元素相关。 我现在不知所措。 我从哪里去? 有没有办法确定哪个SafeHandle属于哪个对象,所以我可以肯定我没有意外地处理它? 除了Close之外还有一些咒语我需要正确关闭SerialPort吗?

如何分发32位和64位版本的库

我有一个C#库,由各种客户端(32位和64位)调用。 到目前为止它被编译为AnyCPU,所以没有问题。 最近我添加了对SQLite .NET库的依赖,它有32位和64位版本(但不是AnyCPU)。 所以,现在,我必须有两个版本 – 两个比特。 在过去,我已经看到了其他库(MS SQL Compact想到),其中有一个方案,其中单个.NET程序集将在文件夹中具有Private\amd64和Private\x86文件夹,并且其中包含相应的本机库会根据需要打电话给每个人。 这种方法对我的情况是否可行? 是否有关于如何实施它的文档? 是否需要更改代码或这是一种分发技术?

String.GetHashCode()返回不同的值

为什么GetHashCode()为同一个字符串返回不同的值? 我无法描述如何复制这个,但相信这不是一个恶作剧,以下两行来自我的观察窗口,分别是两次: “DDD.Events.Application.ApplicationReferenceCreated”.GetHashCode() -1386151123 int “DDD.Events.Application.ApplicationReferenceCreated”.GetHashCode() 1858139950 int 怎么会发生这种情况? 我不知道这是否有帮助,但我在VS 2010中运行.NET 4.0并且我正在调试NServiceBus应用程序。 更新: 如果你想知道我最后做了什么,看看这个线程: 你能在x64模式下运行时生成x86哈希值吗?

我可以遍历.NET4 MemoryCache吗?

我正在使用System.Runtime.Caching.MemoryCache提供的缓存。 我想枚举缓存的项目,以便我可以无效(逐出然后重新加载)项目 foreach (var item in MemoryCache.Default) { item.invalidate() } 但这里发现的官方文件说明: !重要:检索MemoryCache实例的枚举器是一项资源密集型和阻塞操作。 因此,不应在生产应用程序中使用枚举器。 当然必须有一种简单有效的方法来迭代缓存的项目?

IIS抱怨使用LDAP身份validation进行身份模拟

我按照教程在ASP.NET / C#4.0 Web应用程序中实现LDAP身份validation。 我在Visual Studio 2010中这样做了。该站点在调试模式下通过Visual Studio运行良好,但是当我在IIS7中发布此站点时,它失败并出现以下错误: HTTP错误500.24 – 内部服务器错误检测到的ASP.NET设置不适用于集成管理管道模式。 最可能的原因: system.web/identity@impersonate设置为true。 事实上,本教程的一部分要求我将其添加到配置文件中… 那么为什么我会收到此错误,我该如何解决?

IDisposable实现 – ‘if(disposing)’应该包含什么

我一直在winforms应用程序中修复一些内存泄漏问题,并注意到一些非显式处置的一次性对象(开发人员没有调用Dispose方法)。 Finalize方法的实现也没有用,因为它没有进入if (disposing)子句。 所有静态事件取消注册和收集清除都已放入if (disposing)子句中。 如果对象是一次性的,最好的做法就是调用Dispose,但不幸的是,有时会发生这种情况 如果存在非托管对象,静态事件处理程序和一些需要在处置时清除的托管集合。 什么是决定什么应该进入的方式以及if (disposing)条款应该采用什么方式。 处理方法。 // Dispose(bool disposing) executes in two distinct scenarios. // If disposing equals true, the method has been called directly // or indirectly by a user’s code. Managed and unmanaged resources // can be disposed. // If disposing equals false, the method has been called by […]

.NET 4.0中的MembershipProvider

如何将MembershipProvider类添加到VS 2010 B2中的.NET 4.0项目? 我想自定义MembershipProvider,但我不能不添加这个类。 请指导我完成这个过程。