Tag: task parallel library

设置ProcessorAffinity和TPL

如果我为我的进程设置处理器亲和力,如下所示: var me = Process.GetCurrentProcess(); me.ProcessorAffinity = (IntPtr) processorAffinityMask; ……,第三方物流公司是否会尊重其所有工作? 也就是说,是否有任何使用默认调度程序的工具将工作推送到我给定掩码不允许的处理器? 有没有可以certificate这一点的测试?

异步任务暂停循环恢复

我有一个示例代码,取自MSDN,我想在while循环中实现Pause / Resumefunction。 任何人都可以提出一个解决方案/ parern吗? private async void startButton_Click(object sender, RoutedEventArgs e) { resultsTextBox.Clear(); // Instantiate the CancellationTokenSource. cts = new CancellationTokenSource(); try { await AccessTheWebAsync(cts.Token); resultsTextBox.Text += “\r\nDownloads complete.”; } catch (OperationCanceledException) { resultsTextBox.Text += “\r\nDownloads canceled.\r\n”; } catch (Exception) { resultsTextBox.Text += “\r\nDownloads failed.\r\n”; } cts = null; } private void cancelButton_Click(object sender, […]

是Parallel.forEach(DataTable.AsEnumerable()线程安全

使用时如下 Parallel.ForEach(DataTable.AsEnumerable(), dr => { string str = dr[“field1”].ToString(); //…. other stuff dr[“f1”] = oA; dr[“f2”] = oB; dr[“f3”] = oC; }); 每个线程在其自己的数据行上工作的位置 我会假设不是,但有关于假设的说法……

如何等待webclient OpenReadAsync完成

我在Windows Phone 8.1应用程序中使用WebClient从Internet下载一些东西。 下面是我在我的应用程序中使用的示例代码 – 我在下面调用方法,但我的webclient没有等待完成读取操作并在OpenReadAsync调用后立即返回。 我怎样才能确保我的方法返回操作必须等到OpenReadCompleted事件完成后? 我见过多个类似的问题,但找不到解决方案。 MyCustomObject externalObj; // my custom object private static void CheckNetworkFile() { try { WebClient webClient = new WebClient(); webClient.OpenReadCompleted += (s, e) => { externalObj = myReadWebclientResponse(e.Result); // my custom method to read the response }; webClient.OpenReadAsync(new Uri(“http://externalURl.com/sample.xml”, UriKind.Absolute)); } catch (Exception) { externalObj = null; } […]

使用Task加载ObservableCollection

我试图加载我们的活动目录中的所有用户并将其显示在ListBox中。 但是,如果我像平常一样这样做,我会冻结UI线程很长一段时间。 那么无论如何我可以使用任务在后台线程上填充此集合,同时在插入新名称时仍然让列表框更新?

如何为显示的第二个表单获取同步上下文

[编辑]改编和简化整篇文章[/编辑] 在这篇博客中 ,以下(我简化了一下)作为使用SynchronizationContext对象在UI线程上运行Task的示例: Task.Factory.StartNew(() =>”Hello World”).ContinueWith( task => textBox1.Text = task.Result, TaskScheduler.FromCurrentSynchronizationContext()); 我可以在一个新项目中重复这些结果,安全地更新UI,但出于任何原因,在我当前的项目中(尽管它已经工作)我不能。 我得到标准“你不允许从错误的线程更新UI”exception。 我的代码(在MainForm_Load(…)中)是这样的,它在一个新的Project中工作,并且textBox1添加到主窗体中,但在我当前的项目中不起作用: var one = Task.Factory.StartNew( () => “Hello, my name is Inigo Montoya”); var two = one.ContinueWith( task => textBox1.Text = one.Result, TaskScheduler.FromCurrentSynchronizationContext()); 任何人都有任何关于可能是什么的想法。 [编辑] 我已经将错误追溯到对象的实例化,该对象使用表单来提示用户输入登录信息。 只有在显示表单时才会出现错误。 (如果我在Form’s Show发生之前返回一个硬编码的值,整个过程都可以正常工作)。 新问题:如果自己的构造函数在显示之前显示另一个表单,我如何获取正在构建的表单的SynchronizationContext? 以下是如何重现正在发生的事情: 1)创建两个表单:Form1带有TextBox ,Form2带有Button 2)创建一个OwnedBy1Uses2类 Form1 : public partial class Form1 : […]

ConcurrentBag导致内存泄漏吗?

可能重复: ConcurrentBag中可能的内存泄漏? 我的应用程序中有史诗内存泄漏。 从未收集过我在其中一种方法中添加到本地concurrentBag集合中的所有数据。 这个简单的代码演示了我如何使用它: void Main() { var l = new List(){1,2,3,4}; Func(l); l.Clear(); l=null; } void Func(List list) { var bag = new ConcurrentBag(); Parallel.ForEach(list, k=> bag.Add(++k)); list.Clear(); foreach(int i in bag) //I know, I doing it wrong. { list.Add(i); } } 我的期望:将创建包并在方法“Func”处置。 我所看到的:bag永远不会被处置,保存在Parallel.ForEach中创建的所有线程,保存我添加的所有数据。 =( 好的,当我将它添加到列表中时,我可以使用“TryTake”从包中删除项目。 但空袋仍然留在记忆中。 现在我通过使用List而不是ConcurrentBag来解决问题。 但是因为我在记忆中看到这个,所以我睡不着觉。 抱歉我的eng =) UPDATE 我改变了我的方法“Func”: […]

任务似乎自动启动

我正在移植一个具有非常长的加载时间的程序,当我移植它时根本没有改进,因为缓慢是因为访问数据库服务器(而不是次优代码)。 我已经使用Tasks库将加载移动到一个单独的线程上,现在UI在加载时不会冻结,但它确实让我对某些东西感到好奇: Task.Factory对象有一个方法StartNew ,它应该创建一个新任务,启动它,并返回对它的引用。 这是有道理的,但似乎Task构造函数完成了同样的事情。 当我执行以下操作时: Task catsFromDB = new Task(() => AddCategoriesFromDB(cts.Token), cts.Token); catsFromDB.Start(); 我收到一个错误InvalidOperationException ,我真的不明白。 它似乎相信我已经把它踢掉了。 我还没有。 [编辑] erorr是:“InvalidOperationException,可能无法在已完成的任务上调用Start” [编辑] 错误是我包含的一些取消代码。 我需要在尝试再次运行之前重置取消。

等待Task.Delay()延迟预期的时间

我有一个Windows服务应用程序,它大量使用.Net任务。 我对他们有一个很好的理解,但我不是亲,我遇到了问题。 我有一种情况,我的await Task.Delay()有时需要更长的时间(最多60秒)。 我确信这是由于我正在做的事情,但是我无法追踪它可能会影响到这一点。 这是我正在做的事情类型的一个简化的人为例子。 public async Task DoDelay(CancellationToken token = default(CancellationToken)) { // Delay for then check to see if we need to extend our visibility timeout DateTime beforeDelay = DateTime.Now; // Wait for 180 seconds, ie 3 minutes await Task.Delay((int)180 * 1000, token).ConfigureAwait(false); // Check to see how long we actually delayed […]

Howto:Parallel.Foreach在每个进程运行一个新进程(但一次只有一个进程)后执行许多进程?

我相信有人知道这一点,我会非常感谢答案。 我不太了解代表和异步等等 – 所以请给我一个如何实现的一般例子。 我有一个工作流程,我可以使用Parallel.Foreach同时为许多不同的文件执行一个方法(甜,研磨处理器) – 但是在该方法结束后我需要运行另一个方法(它生成一个报告过程),这第二种方法不能并行运行。 我不想等待Parallel.ForEach中的所有文件在生成报告之前完成(这是不必要的)。 但是,如果我在第一个方法结束时启动报告生成方法,那么我会遇到问题。 是否有某种队列或什么? 必须有一些漂亮的方式,对吧? 谢谢