Tag: 任务并行库

使用Task时,如果ThreadPool满/忙,会发生什么?

当我使用使用ThreadPool的.Net 4 Task类时,如果所有线程都忙,会发生什么? TaskScheduler是否创建了一个新线程并扩展了ThreadPool最大线程数,或者它是否等待直到线程可用?

为什么如果从静态构造函数启动并等待,则无法完成空的.NET任务?

我无法理解为什么以下代码不起作用: var task = new Task(() => { }); task.Start(); if (task.Wait(10000)) { logger.Info(“Works”); } else { logger.Info(“Doesn’t work”); } 超时到期后,任务状态停留在“正在运行”,尽管没有任何事情要做。 但是,使用task.RunSynchronously()替换task.Start()将起作用。 有没有人知道我可能做错了什么? 可以在此处找到复制该问题的测试项目: http : //erwinmayer.com/dl/TaskTestProject.zip 。 据我所知,如果具有上述代码的方法在静态构造函数中运行,则它不起作用。 但是如果直接作为静态类方法调用它就可以工作。 最近这篇MSDN博客文章似乎突出了静态构造函数的相关问题: http : //blogs.msdn.com/b/pfxteam/archive/2011/05/03/10159682.aspx

多个线程将元素添加到一个列表。 为什么列表中的项目总是少于预期?

以下代码解释了我的问题。 我知道列表不是线程安全的。 但是这个潜在的“真实”原因是什么? class Program { static void Main(string[] args) { List strCol = new List(); for (int i = 0; i { AddElements(strCol); }).ContinueWith((t) => { WriteCount(strCol, id.ToString()); }); } Console.ReadLine(); } private static void WriteCount(List strCol, string id) { Console.WriteLine(string.Format(“Task {0} is done. Count: {1}. Thread ID: {2}”, id, strCol.Count, Thread.CurrentThread.ManagedThreadId)); } private […]

并行运行多个EntityFramework数据库查询

我试图并行运行3个db查询,但我不确定我是否正确执行。 我已经制作了3个函数,每个函数都对db进行查询。 private static async Task getAccountCodeAsync(string deviceId) { long deviceIdLong = long.Parse(deviceId); using (var db = new NetworksEntities()) { return db.Devices.Where(x => x.DeviceId == deviceIdLong).Select(x => x.AccountCode).FirstOrDefault(); } } private static async Task getDeviceTypeAsync(string deviceId) { long deviceIdLong = long.Parse(deviceId); using (var db = new NetworksEntities()) { return db.Devices.Where(x => x.DeviceId == deviceIdLong).Select(x => […]

是否可以在执行Parallel.ForEach期间更改parallelOptions.MaxDegreeOfParallelism

我正在运行一个multithreading循环: protected ParallelOptions parallelOptions = new ParallelOptions(); parallelOptions.MaxDegreeOfParallelism = 2; Parallel.ForEach(items, parallelOptions, item => { // Loop code here }); 我想在执行并行循环期间更改parallelOptions.MaxDegreeOfParallelism以减少或增加一些线程。 parallelOptions.MaxDegreeOfParallelism = 5; 它似乎没有增加线程。 有没有人有任何想法?

Asp.Net中Task.Run和QueueBackgroundWorkItem之间的区别

究竟有什么区别 Task.Run(() => { LongRunningMethod(); }); 要么 HostingEnvironment.QueueBackgroundWorkItem(clt => LongRunningMethod()); 我在Asp.Net MVC应用程序上进行了测试,在该应用程序中,我在使用Task.Run或QBWI调用的异步任务中继续在文本文件中写入一行约10分钟。 使用Task和QBWI都可以。 我的异步方法一直写入该文件,直到10分钟没有任何问题。 我没有观察到IIS对其回收的干扰。 那么QueueBackgroundWorkItem有什么特别之处呢?

将任务排序为完成顺序

我看到Jon Skeet在大约一年前发表演讲,他展示了一个C#5的片段,它将获取一系列任务并按照他们完成的顺序返回它们。 它使用了async / await和WhenAny并且很漂亮,但我不能为我的生活记住它是如何工作的。 现在我需要它。 我希望弄清楚如何使用类似于此的签名创建方法。 Task<IEnumerable> InOrderOfCompletion(IEnumerable tasks) where T : Task 可以使用如下: public async Task DelayedInt(int i) { await Task.Delay(i*100); return i; } [Test] public async void Test() { Task[] tasks = new[] {5, 7, 1, 3, 2, 6, 4}.Select(DelayedInt).ToArray(); IEnumerable<Task> ordered = await InOrderOfCompletion(tasks); Assert.That(ordered.Select(t => t.Result).ToArray(), Is.EqualTo(new [] {1,2,3,4,5,6,7})); } […]

Task.WhenAll结果排序

我从这里了解到Task.Whenall的任务执行顺序不是确定性的,但我找不到任何有关结果顺序的信息。 结果集合是否按照输入中排序的任务或结果的顺序包含结果? 从我做的测试来看,它似乎保留了订单,但我需要确认。

想要使用任务并行库和进度报告来更新数据库

我开发了一个存储多个连接字符串的应用程序。 我只是迭代for循环并连接每个数据库并对每个数据库执行sql。 这样我用bulk sql语句更新多个数据库。 现在我需要使用现在的任务并行库来同时更新多个数据库,而不是一个接一个地循环更新。 我还想处理exception,并且还希望为多个数据库操作显示多个进度条。 应该有暂停和恢复function。 当我点击按钮时,将打开多个数据库连接,对于每个任务,我的表单中将添加一个新的进度条。 每个进度条将显示每个数据库操作进度。 当任何任务完成后,相应的进度条将从表单中删除。 任何人都可以使用TPL指导我如何使用示例代码。 这里我有一个代码更新一个进度条但我需要更新多个进度条。 int iterations = 100; ProgressBar pb = new ProgressBar(); pb.Maximum = iterations; pb.Dock = DockStyle.Fill; Controls.Add(pb); Task.Create(delegate { Parallel.For(0, iterations, i => { Thread.SpinWait(50000000); // do work here BeginInvoke((Action)delegate { pb.Value++; }); }); }); 更新问题 我是这样做的。 代码有效但所有进度条值依次增加。 我在winform应用程序中有一个表单和一个用户控件。 请看看我的代码并告诉我那里有什么问题。 主要代码 public partial class […]

将同步代码包装到异步方法中的最佳方法是什么

我正在使用async-await方法创建一个应用程序。 但是使用它们对我来说存在很大问题。 在阅读了一些文章之后,我仍然不知道将重同步操作包装到异步方法的最佳方法是什么。 我有2个想法。 哪一个是最好的? 1)目前的实现。 private Task<List> ParseTestFiles(List filesContent) { var tcs = new TaskCompletionSource<List>(); Task.Run(() => { var resultList = new List(); foreach (var testBody in filesContent) { try { var currentCulture = Thread.CurrentThread.CurrentCulture; var serializerSettings = new JsonSerializerSettings { Culture = currentCulture }; var parsedData = JsonConvert.DeserializeObject(testBody, serializerSettings); resultList.Add(parsedData); } catch(Exception exception) […]