Tag: .net 4.5

GetSystemMetrics()为.NET 4.5和.NET 4.0返回不同的结果

在.NET 4.0 – > .NET 4.5应用程序迁移过程中,我发现了一种非常奇怪的行为。 我已经能够将这个问题跟踪到这个简短的代码片段: class Program { [System.Runtime.InteropServices.DllImport(“user32.dll”)] public static extern int GetSystemMetrics(int nIndex); static void Main(string[] args) { const int CXFRAME = 0x20; const int CYFRAME = 0x21; var dx = GetSystemMetrics(CXFRAME); var dy = GetSystemMetrics(CYFRAME); Console.WriteLine(“{0}x{1}”, dx, dy); Console.ReadKey(); } } 使用Target Framework = 4.0 (以及2.0,3.0,3.5)进行编译时,它输出8×8 使用Target Framework = 4.5编译时,它输出4×4 […]

如何将其转换为异步任务?

鉴于以下代码…… static void DoSomething(int id) { Thread.Sleep(50); Console.WriteLine(@”DidSomething({0})”, id); } 我知道我可以将其转换为异步任务,如下所示…… static async Task DoSomethingAsync(int id) { await Task.Delay(50); Console.WriteLine(@”DidSomethingAsync({0})”, id); } 通过这样做,如果我多次调用(Task.WhenAll),一切都会比使用Parallel.Foreach或甚至在循环内调用更快更高效。 但是有一分钟,让我们假装Task.Delay()不存在,我实际上必须使用Thread.Sleep(); 我知道实际情况并非如此,但这是概念代码,延迟/睡眠通常是IO操作,其中没有异步选项(例如早期EF)。 我试过以下…… static async Task DoSomethingAsync2(int id) { await Task.Run(() => { Thread.Sleep(50); Console.WriteLine(@”DidSomethingAsync({0})”, id); }); } 但是,虽然它运行没有错误,但Lucien Wischik认为这实际上是不好的做法,因为它只是从池中启动线程来完成每个任务(使用以下控制台应用程序也会更慢 – 如果你在DoSomethingAsync和DoSomethingAsync2之间交换打电话你可以看到完成所需的时间有显着差异)… static void Main(string[] args) { MainAsync(args).Wait(); } static async Task […]

在ZipArchive C#.Net 4.5中创建目录

ZipArchive是ZipArchiveEntries的集合,添加/删除“条目”非常有效。 但似乎没有目录/嵌套“档案”的概念。 理论上,该类与文件系统分离,因为您可以在内存流中完全创建存档。 但是,如果要在归档中添加目录结构,则必须在条目名称前添加路径前缀。 问题:如何扩展ZipArchive以创建更好的界面来创建和管理目录? 例如,将文件添加到目录的当前方法是使用目录路径创建条目: var entry = _archive.CreateEntry(“directory/entryname”); 而这些方面的东西对我来说似乎更好: var directory = _archive.CreateDirectoryEntry(“directory”); var entry = _directory.CreateEntry(“entryname”);

并行运行异步方法8次

如何将以下内容转换为Parallel.ForEach? public async void getThreadContents(String[] threads) { HttpClient client = new HttpClient(); List usernames = new List(); int i = 0; foreach (String url in threads) { i++; progressLabel.Text = “Scanning thread ” + i.ToString() + “/” + threads.Count(); HttpResponseMessage response = await client.GetAsync(url); String content = await response.Content.ReadAsStringAsync(); String user; Predicate userPredicate; foreach (Match […]

在.NET 4.0应用程序域上加载针对.NET 4.5的程序集

假设系统安装了.NET 4.0和.NET 4.5。 是否可以从针对.NET 4.0编写的程序集中加载和使用.NET 4.5程序集? 简单地说,我可以从.NET 4.0代码调用Assembly.Load来加载.NET 4.5目标程序集吗?

在.NET 4.5中找不到HttpClient

我试图在.NET 4.5中使用新的HttpClient ,但Visual Studio抱怨它不存在。 我有System.Net ,但是当我键入System.Net.Http ,它也会抱怨它。 我应该为这个类下载一个新的distributable吗?

Task.WhenAny和Unobserved Exceptions

假设我有三个任务, a , b和c 。 这三个都保证在1到5秒之间的随机时间抛出exception。 然后我写下面的代码: await Task.WhenAny(a, b, c); 这将最终从任何一个任务故障中抛出exception。 由于没有try…catch这里,这个例外会冒泡到我的代码中的其他地方。 剩下的两个任务抛出exception会发生什么? 是不是这些未被观察到的exception,这将导致整个过程被杀死? 这是否意味着使用WhenAny的唯一方法是在try…catch块中,然后在继续之前以某种方式观察剩余的两个任务? 后续行动:我希望将答案同时应用于.NET 4.5 和 .NET 4.0以及Async Targeting Pack(尽管在这种情况下显然使用了TaskEx.WhenAny )。

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

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

升级到.NET 4.5:ItemsControl与其项目源不一致

我正在构建一个应用程序,它使用许多ItemControls(datagrids和listviews)。 为了从后台线程轻松更新这些列表,我将此扩展用于ObservableCollections,它运行良好: http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx 今天我安装了VS12(后来安装了.NET 4.5),因为我想使用为.NET 4.5编写的组件。 在将我的项目升级到.NET 4.5(从4.0)之前,我的数据网格从workerthread更新时开始抛出InvalidOperationException。 exception消息: 抛出此exception是因为名为’(未命名)’的控件’System.Windows.Controls.DataGrid Items.Count:5’的生成器已收到与Items集合的当前状态不一致的CollectionChanged事件序列。 检测到以下差异:累计计数4与实际计数5不同。[累计计数为(上次重置时计数+ #Adds – 自上次重置后自上次重置)。 Repro代码: XAML: 码: public partial class MainWindow : Window { public ExtendedObservableCollection Items { get; private set; } public MainWindow() { InitializeComponent(); Items = new ExtendedObservableCollection(); DataContext = this; Loaded += MainWindow_Loaded; } void MainWindow_Loaded(object sender, RoutedEventArgs e) { Task.Factory.StartNew(() […]

为什么`IList `不inheritance自`IReadOnlyList `?

当在.NET 4.5中引入IReadOnlyList时,有一段时间我认为拼图的缺失部分最终被插入到位:一种传递真正的只读索引接口的方法,以前我必须使用我自己的只读接口并围绕一切创建包装类。 我期待接口被放置在“自然”层次结构中,理想情况是: IEnumerable .GetEnumerator() -> IReadOnlyCollection : IEnumerable .Count -> IReadOnlyList : IReadOnlyCollection .Item[…] -> IList : IReadOnlyList .Add(…) .Clear() .Contains(…) (etc) 但是,事实certificate, IList不会从IReadOnlyListinheritance 。 是否有一个原因?