Tag: .net 4.0

XMLSerialize一个ObservableCollection

我在observable集合的xml序列化中遇到问题。 这是我序列化的内容: public enum Status { Pending, Active, Completed, Cancelled } public abstract class Entity : INotifyPropertyChanged { … } public class UserStory : Entity { public uint StoryID { get; set; } public Status Status { get; set; } … public ObservableCollection Tasks { get; set; } } public class Task : Entity { […]

为什么我的Catch块仅在Visual Studio中进行调试时运行?

Program.cs中的代码 [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); try { Application.Run(new Form1()); } catch (Exception ex) { MessageBox.Show(“Blah…”); } } 在Form1中,我有一个按钮,代码throw new Exception(“”); 。 如果我从Visual Studio运行应用程序,则会弹出我的消息框(消息’Blah …’)。 但是如果我从可执行文件运行应用程序,那么catch块根本不会执行。 为什么不同? 我使用的是Visual Studio 2010,.NET 4.0,Windows XP。

更新ConcurrentDictionary中的值字段

我试图更新ConcurrentDictionary中的条目,如下所示: class Class1 { public int Counter { get; set; } } class Test { private ConcurrentDictionary dict = new ConcurrentDictionary(); public void TestIt() { foreach (var foo in dict) { foo.Value.Counter = foo.Value.Counter + 1; // Simplified example } } } 基本上我需要遍历字典并更新每个Value上的字段。 我从文档中了解到我需要避免使用Value属性。 相反,我认为我需要使用TryUpdate,除了我不想替换我的整个对象。 相反,我想更新对象上的字段。 在PFX团队博客上阅读此博客条目之后:也许我需要使用AddOrUpdate并且在添加委托中什么都不做。 有没有人对如何做到这一点有任何见解? 我在字典中有成千上万的对象,我需要每30秒左右更新一次。 创建新的以更新属性可能是不可行的。 我需要克隆现有对象,更新它并替换字典中的对象。 我还需要在克隆/添加周期的持续时间内锁定它。 呸。 我想做的是迭代对象并尽可能直接更新Counter属性。 我的最新研究让我看到了Parallel.ForEach,听起来不错,但它不应该用于更新状态的动作。 […]

entity framework和DbContext – 对象跟踪

我对Entity Framework中DbContext的使用有点困惑。 这是我很困惑的场景。 我使用dbcontext中的linq查询来获取数据。 就像是: List transactions = DefaultContext.Transactions.ToList(); 然后我直接在数据库中更新该查询中返回的一个事务中的列。 然后我再打电话: List transactions = DefaultContext.Transactions.ToList(); 当列表返回这次时,它不会反映我在运行update语句时所做的更新/更改,除非我遍历所有事务并重新加载它们: foreach (DbEntityEntry item in DefaultContext.ChangeTracker.Entries()) { DefaultContext.Entry(item.Entity).Reload(); } 这是正常的行为吗? 我假设在我的初始查询中,它们被附加到对象上下文。 然后当我第二次查询时,它不会访问数据库,只是从对象上下文中提取实体,除非我清除/分离或单独重新加载所有实体。

RegLoadAppKey在32位操作系统上运行良好,在64位操作系统上失败,即使两个进程都是32位

我正在使用.NET 4和新的RegistryKey.FromHandle调用,因此我可以从使用RegLoadAppKey打开软件注册表文件获取hKey,并使用现有的托管API对其进行操作。 我一开始以为这只是一个被破坏的DllImport的问题而且我的调用在params中有一个无效的类型或者缺少MarshalAs或者其他什么,但是查看其他注册表函数及其DllImport声明(例如,在pinvoke.net上),我没有看到还有什么要尝试(我已经将hKey作为int和IntPtr返回,两者都在32位操作系统上运行并在64位操作系统上失败) 我已经把它归结为一个简单的repro案例 – 它只是尝试创建一个’随机’子键然后写一个值。 它在我的Win7 x86机箱上工作正常,在Win7 x64和2008 R2 x64上运行失败,即使它仍然是32位进程,甚至是从32位cmd提示符运行。 编辑:如果它是64位进程,它也会以相同的方式失败。 编辑:如果传入的文件是空的,它工作正常 – 问题的情况是现有的软件注册表配置单元。 我从2008 r2(x64)和WHS v1(x86)iso中提取了’裸’软件注册表配置单元文件,两者都有同样的问题。 在Win7 x86上: INFO: Running as Admin in 32-bit process on 32-bit OS Was able to create Microsoft\Windows\CurrentVersion\RunOnceEx\a95b1bbf-7a04-4707-bcca-6aee6afbfab7 and write a value under it 在Win7 x64上,为32位: INFO: Running as Admin in 32-bit process on 64-bit OS Unhandled Exception: […]

ASP.NET Web服务模板不存在?

我使用.Net framework 4完整安装了Visual Studio 2010 。 我想创建我的第一个Web服务。 但不存在Web服务模板。 在visual studio 2010中,我转到File – > New Web Site菜单,但在New Web Site对话框中不存在ASP.NET Web Service模板。 如何创建Web服务?

一个任务可以有多个等待者吗?

我正在为Windows 8项目提供异步服务,并且有一些此服务的异步调用,一次只能调用一次。 public async Task CallThisOnlyOnce() { PropagateSomeEvents(); await SomeOtherMethod(); PropagateDifferentEvents(); } 由于你无法在锁定语句中封装异步调用,我想到使用AsyncLock模式,但我认为我可能会尝试这样的事情: private Task _callThisOnlyOnce; public Task CallThisOnlyOnce() { if(_callThisOnlyOnce != null && _callThisOnlyOnce.IsCompleted) _callThisOnlyOnce = null; if(_callThisOnlyOnce == null) _callThisOnlyOnce = CallThisOnlyOnceAsync(); return _callThisOnlyOnce; } private async Task CallThisOnlyOnceAsync() { PropagateSomeEvents(); await SomeOtherMethod(); PropagateDifferentEvents(); } 因此,最终只能同时执行CallThisOnlyOnceAsync调用,并且多个awaiters挂钩在同一个Task上。 这是一种“有效”的方法吗?或者这种方法有一些缺点吗?

代码契约:我们是否必须在委托方法中冗余地指定Contract.Requires(…)语句?

我打算使用新的.NET 4 Code Contractsfunction进行未来的开发。 这让我想知道是否必须在一系列方法中冗余地指定等效的Contract.Requires(…)语句。 我认为一个代码示例胜过千言万语: public bool CrushGodzilla(string weapon, int velocity) { Contract.Requires(weapon != null); // long code return false; } public bool CrushGodzilla(string weapon) { Contract.Requires(weapon != null); // specify contract requirement here // as well??? return this.CrushGodzilla(weapon, int.MaxValue); } 对于运行时检查它并不重要,因为我们最终总是会遇到需求检查,如果失败我们会收到错误。 但是,当我们再次在第二次超载中没有指定合同要求时,这被认为是不好的做法吗? 此外,还将具有编译时检查的function ,并且还可能设计代码合同的时间检查 。 在Visual Studio 2010中,它似乎尚不适用于C#,但我认为有一些类似Spec#的语言已经可以使用。 当我们编写代码来调用这样的方法并且我们的参数当前可以或将为null时,这些引擎可能会给我们提示。 所以我想知道这些引擎是否总是会分析一个调用堆栈,直到找到一个目前不满意的合同方法? 此外, 在这里我了解了Contract.Requires(…)和Contract.Assume(…)之间的区别 。 […]

使用Async和Await进行异步编程

我正在阅读本教程,了解如何在c#中异步编程并遇到错误我不知道如何解决。 这是链接: http : //msdn.microsoft.com/en-us/library/hh191443.aspx ,错误是: Cannot find all types required by the ‘async’ modifier. Are you targeting the wrong framework version, or missing a reference to an assembly? 我的目标是.NET 4.0框架,并且不确定是否需要任何其他程序集。 这是代码: public async Task AccessTheWebAsync(Class1 class1, Class2 class2) { // GetStringAsync returns a Task. That means that when you await the // task you’ll […]

MemoryMappedFile不适用于2个进程?

我用MemoryMappedFile做了一个简单的测试,因为msdn说: 2个进程,1个内存映射文件: 第一个进程添加字符串“1” 第一个进程等待 第二个进程添加字符串“2”并终止 第一个进程现在读取整个内存映射文件 过程A: using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew(“testmap”, 10000)) { bool mutexCreated; Mutex mutex = new Mutex(true, “testmapmutex”, out mutexCreated); using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { BinaryWriter writer = new BinaryWriter(stream, Encoding.UTF8); writer.Write(“1”); } mutex.ReleaseMutex(); Console.WriteLine(“Start Process B and press ENTER to continue.”); Console.ReadLine(); mutex.WaitOne(); using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { […]