Tag: 任务 并行库

等待Task.Delay花费的时间比预期的要长

我写了一个multithreading应用程序,它广泛使用async / await。 它应该在预定的时间下载一些东西。 为此,它使用’await Task.Delay’。 有时它每分钟发送数千个请求。 它按预期工作,但有时我的程序需要记录大的东西。 如果是这样,它会序列化许多对象并将它们保存到文件中。 在那段时间里,我注意到我的计划任务执行得太晚了。 我已将所有日志记录放在具有最低优先级的单独线程中,并且问题不再经常发生,但它仍然会发生。 事情是,我想知道它何时发生,以便知道我必须使用类似的东西: var delayTestDate = DateTime.Now; await Task.Delay(5000); if((DateTime.Now – delayTestDate).TotalMilliseconds > 6000/*delays up to 1 second are tolerated*/) Console.WriteLine(“The task has been delayed!”); 而且,我发现我也使用的’Task.Run’也会导致延迟。 要监控它,我必须使用更丑陋的代码: var delayTestDate = DateTime.Now; await Task.Run(() => { if((DateTime.Now – delayTestDate).TotalMilliseconds > 1000/*delays up to 1 second are tolerated*/) […]

充分利用.NET任务并行库

问题1。 使用Parallel.For和Parallel.ForEach更适合处理有序或无序的任务吗? 我问的原因是我最近更新了一个串行循环,其中一个StringBuilder用于根据各种参数生成一个SQL语句。 结果是,与使用标准foreach循环相比,SQL有点混乱(到了包含语法错误的程度),因此我的直觉是TPL不适合执行数据必须出现在特别的顺序。 问题2。 TPL是否自动使用多核架构,我必须在执行前配置任何内容吗? 我提出这个问题的原因与我提出的有关TPL操作性能分析的问题有关。 对这个问题的回答使我明白TPL并不总是比标准串行循环更有效,因为应用程序可能无法访问多个内核,因此创建额外线程和循环的开销会导致性能下降到标准的串行循环。

将CurrentCulture设置为Task creator CurrentCulture来执行任务

我有一个使用Tasks的应用程序。 我们还修改了cultureInfo(我们使用EN-US语言,但保留日期/数字格式),我们使用.Net 4.0。 应用程序有很multithreading和任务,我们有一个工厂来创建任务/线程。 对于该线程,我们有以下代码,以确保使用正确的CurrentCulture启动每个线程: //This is basically only the constructor, but it describe well how we create the Thread: public MonitoredThread(ThreadStart threadStart, string name, bool isBackground = false) { m_threadStart = threadStart; m_name = name; m_isBackground = isBackground; Thread = new Thread(ThreadWorker) { Name = name, IsBackground = isBackground, CurrentCulture = CustomCultureInfo.CurrentCulture, CurrentUICulture = […]

嵌套的Parallel.ForEach循环

我有一些代码,我目前正在优化多核架构中的并发性。 在我的一个课程中,我找到了一个嵌套的foreach循环。 基本上,外部循环遍历NetworkInterface对象数组。 内循环通过网络接口IP地址进行迭代。 它让我思考,是否有嵌套Parallel.ForEach循环必然是一个好主意? 阅读本文( 嵌套Parallel.ForEach循环在同一个列表上? )后,我仍然不确定在效率和并行设计方面适用的是什么。 此示例将Parallel.Foreach语句应用于两个循环都在该列表上执行操作的列表。 在我的例子中,循环正在做不同的事情,所以,我应该: 使用嵌套的Parallel.ForEach循环? 父循环上的User Parallel.ForEach并保持内部循环原样?

在asp.net进程中运行多个并行任务的正确方法是什么?

我想我不理解什么。 我原以为Task.Yield()强制为一个任务启动一个新的线程/上下文,但是在重新阅读这个答案时,它似乎只是强制该方法是异步的。 它仍然是在相同的背景下。 什么是正确的方法 – 在asp.net进程中 – 并行创建和运行多个任务而不会导致死锁? 换句话说,假设我有以下方法: async Task createFileFromLongRunningComputation(int input) { //many levels of async code } 当某个POST路由被命中时,我想同时启动上述方法3次, 立即返回 ,但是当完成所有这三个时都要记录。 我想我需要在我的行动中加入这样的东西 public IHttpAction Post() { Task.WhenAll( createFileFromLongRunningComputation(1), createFileFromLongRunningComputation(2), createFileFromLongRunningComputation(3) ).ContinueWith((Task t) => logger.Log(“Computation completed”) ).ConfigureAwait(false); return Ok(); } 什么需要进入createFileFromLongRunningComputation ? 我原以为Task.Yield是正确的,但显然不是。

并行循环调用中的进度条

我试图在multithreading环境中更新进度条。 我知道很多问题已经解决了这个问题,但提议的解决方案都没有对我有用。 这是我的代码的主干: public static void DO_Computation(//parameters) { //Intialisation of parameters Parallel.For(struct initialisation with local data) { //business logic //Call to update_progressbar (located in an another class, as the DO_Computation function is in Computation.cs class (not deriving from Form). WinForm.Invoke((Action)delegate {Update_Progress_Bar(i);}); //WinForm is a class that exposes the progressbar. } } 这不起作用(进度条在达到100%时冻结,这是正常的(我们可以参考这个问题的微软文章 (事实上​​,这不是一个线程安全的操作方法)。)Microsoft网站stiraptes to wrap […]

何时使用TaskCreationOptions.LongRunning?

我很想知道这一点,但从未真正找到答案。 我知道这是任务调度程序的一个提示,任务调度程序将在其中运行,并且任务调度程序可以(或现在将?)决定为该任务实例化非线程池线程。 我不知道(并且令人惊讶地在互联网上找不到)是一些“经验法则”何时将任务指定为长时间运行。 是一秒多长? 30秒? 一分钟? 5分钟? 它是否与应用程序使用的任务量有关系? 作为程序员,我应该使用线程池中的#threads进行一些计算,我创建了多少个任务,同时长时间运行了多少个任务,并根据这个来决定是否使用长时间运行的任务? 希望在这里学点东西。

.NET的multithreading与多处理:糟糕的Parallel.ForEach性能

我编写了一个非常简单的“字数统计”程序,它读取文件并计算文件中每个单词的出现次数。 以下是代码的一部分: class Alaki { private static List input = new List(); private static void exec(int threadcount) { ParallelOptions options = new ParallelOptions(); options.MaxDegreeOfParallelism = threadcount; Parallel.ForEach(Partitioner.Create(0, input.Count),options, (range) => { var dic = new Dictionary<string, List>(); for (int i = range.Item1; i < range.Item2; i++) { //make some delay! //for (int x = 0; […]

取消令牌的任务?

鉴于取消令牌,我想创建一个等待它的任务,这是永远不会完成但可以取消。 我需要这样的模式,IMO应该很常见: async Task DoStuff(Task t, CancellationToken ct) { // t was made from TaskCompletionSource, // both t and ct are beyond my control Task t2 = TaskFromCancellationToken(ct); await Task.WhenAny(t, t2); // do stuff } 我到目前为止最好的想法是: Task TaskFromCancelationToken(CancellationToken ct) { return Task.Delay(Timeout.Infinite, ct); } 是否有更好的方法来实现这种逻辑?

我该怎么做才能在.NET 2.0中使用Task ?

.NET 4.0有TPL,它包含很好的Task类来封装异步编程模型。 我正在开发一个必须是.NET 2.0的应用程序,但我想避免重写Task。 有什么建议?