标签: task-parallel-library

.Net TPL:具有任务优先级的有限并发级别任务调度程序?

我目前正在使用这里详细介绍的LimitedConcurrencyLevelTask​​Scheduler http://msdn.microsoft.com/en-us/library/ee789351.aspx

我想增强这一点,以便为个人任务分配优先权.这些优先级不需要映射到线程优先级.它应该只影响任务的启动顺序.

有谁知道这样一个任务调度程序的例子?(很多调度的东西都在我头上,所以如果有现有的解决方案会很棒)

.net c# task-parallel-library

18
推荐指数
1
解决办法
1万
查看次数

在另一个线程中运行WPF控件

我在我的项目中使用了一个可视化控件,它来自一个我没有源代码的库.
更新(大约200ms)以获得良好的UI响应时间需要很长时间,其中三个控件同时在屏幕上显示.(我可能需要一次更新所有三个,这使得我的UI在他们都在思考的时候停留了大约600毫秒).

我已经阅读了一些关于TaskSchedulers的帖子,并开始研究并行任务功能,作为在自己的线程中运行每个控件的一种方式.该平台将是多核的,所以我想利用同步处理.

问题是我甚至不知道我不知道如何解决这个问题.

是否有合适的设计模式用于在WPF中的主UI线程的单独线程中运行控件?

具体来说:它是第三方地图控件,当给定新位置或缩放级别时需要太长时间才能重绘(~200ms).可能有三个更新最多4Hz - 显然它们不会跟上..
我已经在用户控件中封装了WPF控件,并且需要在它自己的线程中运行每个实例,同时仍然捕获用户输入(鼠标点击, 例如).

更新:虽然我正在寻找解决方案,但到目前为止我已实施了以下内容.
我的主(UI)线程产生一个线程,该线程创建一个包含相关控件的新窗口,并将其定位在正确的位置(这样它看起来只是一个普通的控件).

_leftTopThread = new Thread(() =>
{
   _topLeftMap = new MapWindow()
   {
      WindowStartupLocation = WindowStartupLocation.Manual,
      Width = leftLocation.Width,
      Height = leftLocation.Height,
      Left = leftLocation.X,
      Top = leftLocation.Y,
      CommandQueue = _leftMapCommandQueue,
   };

   _topLeftMap.Show();
   System.Windows.Threading.Dispatcher.Run();

});

_leftTopThread.SetApartmentState(ApartmentState.STA);
_leftTopThread.IsBackground = true;
_leftTopThread.Name = "LeftTop";
_leftTopThread.Start();
Run Code Online (Sandbox Code Playgroud)

哪个CommandQueue线程安全的BlockingCollection队列,用于向地图发送命令(移动位置等).
现在的问题是,我可以

  • System.Windows.Threading.Dispatcher.Run()呼叫而有用户输入
  • 或阻塞CommandQueue,侦听主线程发送的命令

我无法等待命令,因为它会吸收我所有的线程CPU!
是否有可能阻止有事件消息泵的工作?

c# wpf multithreading blocking task-parallel-library

18
推荐指数
2
解决办法
1万
查看次数

System.Threading.Task什么时候有用?

我广泛使用了大部分线程库.我非常熟悉创建新的Threads,创建BackgroundWorkers和使用内置的.NET ThreadPool(这些都非常酷).

但是,我从未找到使用Task类的理由.我看过可能有一两个人使用它们的例子,但是这些例子不是很清楚,并且没有给出为什么人们应该使用任务而不是新线程的高级概述.

问题1:从高级别开始,什么时候使用一个有用的任务而不是其他.NET并行方法?

问题2:是否有人有一个简单和/或中等难度的例子来演示如何使用任务?

c# parallel-processing multithreading task task-parallel-library

18
推荐指数
1
解决办法
2万
查看次数

在.Net中实现并行任务队列

一个图像说的不仅仅是文字,所以这里基本上就是我想要实现的目标:(
为了简洁起见,我还使用了水果类比)
在此输入图像描述

我过去很多次使用不同的.Net类之王(BackGroundWOrkers,ThreadPool,Self Made Stuff ......)做过这种事情.

我在这里要求提供建议并获得有关如何有效地做到这一点的新想法.
这是一个高计算程序,因此我收到数百万(结构相似但内容不相似)的数据,这些数据必须排队才能根据其内容类型进行处理.因此,我想避免为每个要处理的单个数据创建并行任务(这会使CPU过载并且设计不佳恕我直言).这就是为什么我想到只有一个线程为EACH数据TYPE运行,专门用于处理它(知道"Press Juice"方法是通用的并且独立于要按下的水果)

欢迎任何想法和实施建议.
我可以自由地提供任何进一步的细节.

.net c# multithreading task-parallel-library

18
推荐指数
2
解决办法
7109
查看次数

允许异步方法一次只调用一个实例

我有一个方法不能同时在多个线程中执行(它写入文件).我不能用lock,因为方法是async.如何避免在另一个线程中调用该方法?程序应该等待上一次调用完成(也是异步),而不是第二次调用它.

例如,使用以下代码创建一个新的C#控制台应用程序:

using System;
using System.IO;
using System.Threading.Tasks;
namespace ConsoleApplication1 {
    internal class Program {

        private static void Main () {
            CallSlowStuff();
            CallSlowStuff();
            Console.ReadKey();
        }

        private static async void CallSlowStuff () {
            try {
                await DoSlowStuff();
                Console.WriteLine("Done!");
            }
            catch (Exception e) {
                Console.WriteLine(e.Message);
            }
        }

        private static async Task DoSlowStuff () {
            using (File.Open("_", FileMode.Create, FileAccess.Write, FileShare.None)) {
                for (int i = 0; i < 10; i++) {
                    await Task.Factory.StartNew(Console.WriteLine, i);
                    await Task.Delay(100);
                }
            }
        } …
Run Code Online (Sandbox Code Playgroud)

.net c# locking task-parallel-library async-await

18
推荐指数
1
解决办法
8785
查看次数

I/O性能 - 异步与TPL对比数据流与RX

我有一块C#5.0代码,可以生成大量的网络和磁盘I/O. 我需要并行运行此代码的多个副本.以下哪种技术可能会给我带来最佳性能:

  • 等待的异步方法

  • 直接使用TPL中的Task

  • TPL数据流nuget

  • 反应性扩展

我不太擅长这种平行的东西,但如果使用较低的杠杆,比如说Thread,可以给我更好的性能,我也会考虑.

conceptual task-parallel-library system.reactive async-await tpl-dataflow

18
推荐指数
3
解决办法
7426
查看次数

WebAPI中的长时间运行任务

这是我的问题:我需要在ApiController中调用多个第三方方法.这些方法的签名是Task DoSomethingAsync(SomeClass someData, SomeOtherClass moreData).在ApiController将数据发送回客户端后,我希望这些调用继续在后台运行.当DoSomethingAsync完成我想要做一些记录,也许一些数据保存到文件系统.我怎样才能做到这一点?我更喜欢使用asyny/await语法.

task-parallel-library async-await asp.net-web-api

18
推荐指数
3
解决办法
3万
查看次数

线程安全的实体框架6

刚刚开始测试EF6及其异步功能.当我意识到他们不是线程安全时,男孩感到很惊讶.我有点认为那就是重点.

我已经有了Task多年自己的扩展方法,但是我在EF等待的是让它们保持线程安全.

至少我的基于任务的功能被lock编辑为不互相干扰.EF6甚至没有那么远.但主要问题是我的代码与他们的代码共享.即尝试发出异步查询,然后在它完成之前尝试访问导航延迟加载的导航属性(在同一上下文中预先加载的完全独立的实体上).这可以由UI或直接功能之外的其他代码触发,也可以由十几个其他场景触发.

据我所知.dbContext中仅有的两个共享(实体之间)可变资源是连接和更改跟踪(缓存).如果我们可以在功能性上添加锁定,那么我们就会有一个线程安全的上下文.

我们甚至可以分两个阶段完成.如果我们可以实现一个锁定用于查询数据库的集中函数的提供程序.然后任何非跟踪查询 - 通过返回非实体(匿名)对象或通过调用AsNoTracking() - 将是线程安全的,并且即使另一个线程可能要求延迟加载的对象,使用异步函数调用也是安全的.

我们的可扩展性不会更糟,我们现在必须使用每个线程一个上下文,如果你试图跳过一个等待引入一些并行性或者正在工作的事情,甚至Async函数都不在桌面上系统(如wpf)可能会在等待的函数返回任务时触发.

所以我的问题是.有没有人实现这样的提供者.或者有人愿意和我一起工作吗?

multithreading entity-framework task-parallel-library entity-framework-6

18
推荐指数
1
解决办法
9496
查看次数

TAP全局异常处理程序

此代码抛出异常.是否可以定义将捕获它的应用程序全局处理程序?

string x = await DoSomethingAsync();
Run Code Online (Sandbox Code Playgroud)

使用.net 4.5/WPF

.net c# exception task-parallel-library async-await

18
推荐指数
1
解决办法
3444
查看次数

我对async/await的理解,它是如何工作的以及它的好处,对吗?

我曾经多次断言我对async/await的理解,经常就我是否正确进行辩论.如果有人能够证实或否认我的理解,并清除任何误解,以便我不传播错误信息,我真的很感激.

高级别的理解

async/ await是一种在编写异步代码时避免回调地狱的方法.正在执行异步方法的线程在遇到线程池时将返回线程池await,并在等待的操作完成后将执行该操作.

低级别的理解

JIT会将异步方法拆分为await点周围的离散部分,允许在保留方法状态的情况下重新进入方法.在封面下,这涉及某种状态机.

与并发的关系

async/ await并不意味着任何形式的并发.使用async/ 编写的应用程序await可以完全是单线程的,同时仍然可以获得所有好处,就像node.js尽管有回调一样.与node.js不同,.NET是多线程的,因此通过使用async/ await,您可以获得非阻塞IO的好处,而无需使用回调,同时还具有多个执行线程.

好处

async/ await释放线程以在等待IO完成时执行其他操作.它还可以与TPL一起使用,以在多个线程上执行CPU绑定工作,或者在UI线程之外执行CPU绑定工作.

为了从非阻塞IO中受益,需要在API之上构建异步方法,这些API 实际上利用了最终由OS提供的非阻塞IO.

滥用

这是我理解中最大的争论点.很多人认为在a中Task使用阻塞操作并使用async/ await会带来性能提升.通过创建一个额外的线程来处理操作,将原始线程返回到线程池,然后在任务完成后恢复原始方法,所有发生的都是不必要的上下文切换,而不是真正释放线程来完成其他工作.虽然这并不像TPL那样滥用async/ await,但这种心态似乎源于对async/ 的误解await.

.net task-parallel-library async-await

18
推荐指数
1
解决办法
362
查看次数