Tag: task parallel library

Parallel.For和Break()误会?

我正在研究For循环中的Parallelism Break。 阅读本文后 ,我仍然有一个问题: 我希望这段代码: Parallel.For(0, 10, (i,state) => { Console.WriteLine(i); if (i == 5) state.Break(); } 最多产生 6个数字(0..6)。 他不仅没有这样做,而且结果长度不同: 02351486 013542 0135642 很烦人。 (这里的地狱是Break(){5之后}这里??) 所以我看了msdn Break可以用于与循环通信,在当前迭代之后不需要运行其他迭代。 如果从for循环的第100次迭代调用Break从0到1000并行迭代,则仍应运行小于100的所有迭代,但不需要从101到1000的迭代。 问题#1: 哪个迭代? 整个迭代计数器? 还是每个线程? 我很确定这是每个post。 请批准。 问题2 : 让我们假设我们使用并行+范围分区(由于元素之间没有cpu成本变化),因此它在线程之间划分数据。 所以如果我们有4个核心(并且它们之间有完美的划分): core #1 got 0..250 core #2 got 251..500 core #3 got 501..750 core #4 got 751..1000 所以core […]

SendMailAsync:在异步操作仍处于挂起状态时完成的异步模块或处理程序

使用SendMailAsync我收到以下错误: 在异步操作仍处于挂起状态时完成异步模块或处理程序 我的代码: public static async Task SendEmail(MessageContent messageContent, string emailBody) { SmtpClient smtpClientNoSend = new SmtpClient(); await smtpClientNoSend.SendMailAsync(mailMessage); } 从控制器呼叫: public async System.Threading.Tasks.Task Register() { await SendEmail(); } private void SendEmail() { SMTPEmail.SendEmail(msg, output.ToString()); return null; }

Task.WhenAny – 剩余的正在运行的任务会发生什么?

我有以下代码: List<Task> tasks = tasksQuery.ToList(); while (tasks.Any()) { Task completedTask = await Task.WhenAny(tasks); if (await completedTask) return true; tasks.Remove(completedTask); } 它并行启动任务。 当第一个完成的任务返回true时,方法返回true。 我的问题是: 所有剩余的任务已经启动并且可能仍在后台运行会发生什么? 这是执行异步,并行和在第一个条件发生后应该返回的代码的正确方法,还是最好逐个启动它们并等待它们? 谢谢

触发在X毫秒后启动的操作

我正在开发一个Xamarin Forms移动应用程序,它有一个包含SearchBar,ListView和Map控件的页面。 列表视图包含一个地址列表,这些地址在地图上反映为引脚。 当用户在SearchBar中键入时,ListView会自动更新(通过ViewModel绑定)。 过滤列表数据源的ViewModel方法看起来像这样…… void FilterList() { listDataSource = new ObservableCollection( locationData.Where(l => l.Address.Contains(searchBar.Text)) ); // ***** Now, update the map pins using the data in listDataSource } 我希望更新Map,因为ListView被过滤,但不是在每个按键上,因为这可能每秒发生多次。 本质上,我想在更新Map之前在每个FilterList事件中进行“滚动暂停”。 在伪代码中…… // ***** Now, update the map pins using the data in listDataSource if (a previously-requested map update is pending) { // Cancel the […]

优雅地处理任务取消

当我需要能够取消大型/长期运行工作负载的任务时,我经常使用与此类似的模板来执行任务: public void DoWork(CancellationToken cancelToken) { try { //do work cancelToken.ThrowIfCancellationRequested(); //more work } catch (OperationCanceledException) { throw; } catch (Exception ex) { Log.Exception(ex); throw; } } 不应将OperationCanceledException记录为错误,但如果任务要转换为已取消状态,则不得吞下。 除了此方法的范围之外,不需要处理任何其他exception。 这总觉得有些笨重,默认情况下,visual studio会在OperationCanceledException中抛出(虽然因为我使用了这种模式,我现在因为OperationCanceledException而关闭了User-unhandled’)。 理想情况下,我认为我希望能够做到这样的事情: public void DoWork(CancellationToken cancelToken) { try { //do work cancelToken.ThrowIfCancellationRequested(); //more work } catch (Exception ex) exclude (OperationCanceledException) { Log.Exception(ex); throw; } } […]

表观BufferBlock.Post/Receive/ReceiveAsync种族/错误

交叉发布到http://social.msdn.microsoft.com/Forums/en-US/tpldataflow/thread/89b3f71d-3777-4fad-9c11-50d8dc81a4a9 我知道……我并没有真正使用TplDataflow来发挥它的最大潜力。 ATM我只是使用BufferBlock作为消息传递的安全队列,其中生产者和消费者以不同的速率运行。 我看到一些奇怪的行为让我感到难以理解如何继续。 private BufferBlock messageQueue = new BufferBlock(); public void Send(object message) { var accepted=messageQueue.Post(message); logger.Info(“Send message was called qlen = {0} accepted={1}”, messageQueue.Count,accepted); } public async Task GetMessageAsync() { try { var m = await messageQueue.ReceiveAsync(TimeSpan.FromSeconds(30)); //despite messageQueue.Count>0 next line //occasionally does not execute logger.Info(“message received”); //……. } catch(TimeoutException) { //do something […]

在c#中启动许多异步任务的语法

我在c#中使用新的async / await工具时遇到了麻烦。 这是我的情景: static async Task ManageSomeRemoteTask(int Id, bool flag) { var result = await serviceClient.AuthenticateIdAsync(Id); [… Setup Some Data …] await serviceClient.LongAndSlowRemoteCallAsync(Data); } static void SendATonOfJunkToSomeWebServiceThatDoesntSupportBatches { var myTasks = Dictionary<int, Task>(); while(IdsLeftToProcess > 0 ) { Task t = ManageSomeRemoteTask(Id, true); myTasks.Add(IdsLeftToProcess ,t); myTasks[IdsLeftToProcess].Start(); IdsLeftToProcess –; } Task.WaitAll(myTasks.Values.ToArray()); //Wait until they are […]

并行任务库WaitAny Design

我刚开始探索PTL并有一个设计问题。 我的场景:我有一个URL列表,每个URL都引用一个图像。 我希望每个图像并行下载。 一旦下载了至少一个图像,我想执行一个对下载的图像执行某些操作的方法。 该方法不应该并行化 – 它应该是串行的。 我认为以下内容可行,但我不确定这是否是正确的方法。 因为我有收集图像的单独类以及对收集的图像做“某事”,所以我最终传递了一系列似乎错误的任务,因为它暴露了如何检索图像的内部工作方式。 但我不知道如何解决这个问题。 实际上,这两种方法都有更多,但这对此并不重要。 只要知道它们真的不应该归结为一个大的方法,它既可以检索也可以对图像做一些事情。 //From the Director class Task[] downloadTasks = collector.RetrieveImages(listOfURLs); for (int i = 0; i < listOfURLs.Count; i++) { //Wait for any of the remaining downloads to complete int completedIndex = Task.WaitAny(downloadTasks); Image completedImage = downloadTasks[completedIndex].Result; //Now do something with the image (this “something” […]

使用TPL的生产者消费者模型,.net 4.0中的任务

我有一个相当大的XML文件(大约1-2GB)。 要求是将xml数据持久保存到数据库中。 目前,这是通过3个步骤实现的。 尽可能多地读取内存占用较少的大文件 从xml-data创建实体 使用SqlBulkCopy将创建的实体中的数据存储到数据库中。 为了获得更好的性能,我想创建一个Producer-consumer模型,其中生产者创建一组实体,例如批量为10K并将其添加到Queue中。 并且消费者应该从队列中获取批量实体并使用sqlbulkcopy持久化到数据库。 谢谢,Gokul void Main() { int iCount = 0; string fileName = @”C:\Data\CatalogIndex.xml”; DateTime startTime = DateTime.Now; Console.WriteLine(“Start Time: {0}”, startTime); FileInfo fi = new FileInfo(fileName); Console.WriteLine(“File Size:{0} MB”, fi.Length / 1048576.0); /* I want to change this loop to create a producer consumer pattern here to process […]

C#股票代码的异步任务

我一直在努力学习有关异步任务和线程的更多信息,但却没有取得很大进展。 我正在尝试加载一个“引擎”类型的线程,该线程将在启动时在后台运行,并且能够访问UI线程以更新变量,而无需挂起UI线程。 在下面的代码中,调用Engine,并创建一个Ticker对象,它保存名为Last的(Litecoin / USD)的当前值,还包含其他几个有用的值。 此代码成功将当前值分配给label1.text。 我不一定需要代码,但我会采用什么方法在后台每秒创建一个ticker对象,并使用每个新的Ticker对象值更新UI线程。 这对背景工作者来说是个好例子吗? private void Form1_Load(object sender, EventArgs e) { Engine(); } private void Engine() { Ticker ltcusd = BtceApi.GetTicker(BtcePair.LtcUsd); label1.Text = “LTC/USD:” + ltcusd.Last; } 编辑:如果我执行以下操作,由于跨线程操作尝试(UI线程中的label1),label1抛出InvalidOperationException。 private void Form1_Load(object sender, EventArgs e) { var t = Task.Factory.StartNew(() => Engine()); t.Start(); } private void Engine() { while (true) { Thread.Sleep(1000); […]