我目前正在使用这里详细介绍的LimitedConcurrencyLevelTaskScheduler http://msdn.microsoft.com/en-us/library/ee789351.aspx
我想增强这一点,以便为个人任务分配优先权.这些优先级不需要映射到线程优先级.它应该只影响任务的启动顺序.
有谁知道这样一个任务调度程序的例子?(很多调度的东西都在我头上,所以如果有现有的解决方案会很棒)
我在我的项目中使用了一个可视化控件,它来自一个我没有源代码的库.
更新(大约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()呼叫而有用户输入我无法等待命令,因为它会吸收我所有的线程CPU!
是否有可能阻止并有事件消息泵的工作?
我广泛使用了大部分线程库.我非常熟悉创建新的Threads,创建BackgroundWorkers和使用内置的.NET ThreadPool(这些都非常酷).
但是,我从未找到使用Task类的理由.我看过可能有一两个人使用它们的例子,但是这些例子不是很清楚,并且没有给出为什么人们应该使用任务而不是新线程的高级概述.
问题1:从高级别开始,什么时候使用一个有用的任务而不是其他.NET并行方法?
问题2:是否有人有一个简单和/或中等难度的例子来演示如何使用任务?
c# parallel-processing multithreading task task-parallel-library
一个图像说的不仅仅是文字,所以这里基本上就是我想要实现的目标:(
为了简洁起见,我还使用了水果类比)

我过去很多次使用不同的.Net类之王(BackGroundWOrkers,ThreadPool,Self Made Stuff ......)做过这种事情.
我在这里要求提供建议并获得有关如何有效地做到这一点的新想法.
这是一个高计算程序,因此我收到数百万(结构相似但内容不相似)的数据,这些数据必须排队才能根据其内容类型进行处理.因此,我想避免为每个要处理的单个数据创建并行任务(这会使CPU过载并且设计不佳恕我直言).这就是为什么我想到只有一个线程为EACH数据TYPE运行,专门用于处理它(知道"Press Juice"方法是通用的并且独立于要按下的水果)
欢迎任何想法和实施建议.
我可以自由地提供任何进一步的细节.
我有一个方法不能同时在多个线程中执行(它写入文件).我不能用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) 我有一块C#5.0代码,可以生成大量的网络和磁盘I/O. 我需要并行运行此代码的多个副本.以下哪种技术可能会给我带来最佳性能:
等待的异步方法
直接使用TPL中的Task
TPL数据流nuget
反应性扩展
我不太擅长这种平行的东西,但如果使用较低的杠杆,比如说Thread,可以给我更好的性能,我也会考虑.
conceptual task-parallel-library system.reactive async-await tpl-dataflow
这是我的问题:我需要在ApiController中调用多个第三方方法.这些方法的签名是Task DoSomethingAsync(SomeClass someData, SomeOtherClass moreData).在ApiController将数据发送回客户端后,我希望这些调用继续在后台运行.当DoSomethingAsync完成我想要做一些记录,也许一些数据保存到文件系统.我怎样才能做到这一点?我更喜欢使用asyny/await语法.
刚刚开始测试EF6及其异步功能.当我意识到他们不是线程安全时,男孩感到很惊讶.我有点认为那就是重点.
我已经有了Task多年自己的扩展方法,但是我在EF等待的是让它们保持线程安全.
至少我的基于任务的功能被lock编辑为不互相干扰.EF6甚至没有那么远.但主要问题是我的代码与他们的代码共享.即尝试发出异步查询,然后在它完成之前尝试访问导航延迟加载的导航属性(在同一上下文中预先加载的完全独立的实体上).这可以由UI或直接功能之外的其他代码触发,也可以由十几个其他场景触发.
据我所知.dbContext中仅有的两个共享(实体之间)可变资源是连接和更改跟踪(缓存).如果我们可以在功能性上添加锁定,那么我们就会有一个线程安全的上下文.
我们甚至可以分两个阶段完成.如果我们可以实现一个锁定用于查询数据库的集中函数的提供程序.然后任何非跟踪查询 - 通过返回非实体(匿名)对象或通过调用AsNoTracking() - 将是线程安全的,并且即使另一个线程可能要求延迟加载的对象,使用异步函数调用也是安全的.
我们的可扩展性不会更糟,我们现在必须使用每个线程一个上下文,如果你试图跳过一个等待引入一些并行性或者正在工作的事情,甚至Async函数都不在桌面上系统(如wpf)可能会在等待的函数返回任务时触发.
所以我的问题是.有没有人实现这样的提供者.或者有人愿意和我一起工作吗?
multithreading entity-framework task-parallel-library entity-framework-6
此代码抛出异常.是否可以定义将捕获它的应用程序全局处理程序?
string x = await DoSomethingAsync();
Run Code Online (Sandbox Code Playgroud)
使用.net 4.5/WPF
我曾经多次断言我对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.
c# ×6
.net ×5
async-await ×5
blocking ×1
conceptual ×1
exception ×1
locking ×1
task ×1
tpl-dataflow ×1
wpf ×1