Tag: 任务并行库

具有多个任务和UI同步的WinForms TPL模式 – 这是正确的吗?

我是TPL(任务并行库)的新手,我想知道以下是否是最有效的方法来启动1个或多个任务,整理结果并在数据网格中显示它们。 Search1和Search2与两个单独的数据库通信,但返回相同的结果。 我禁用按钮并打开微调器。 我正在使用一个ContinueWhenAll方法调用来关闭任务。 我已将调度程序添加到ContinueWhenAll调用以更新表单按钮,datagrid,并关闭微调器。 问:我这样做是对的吗? 有没有更好的办法 ? 问:我如何为此添加取消/exception检查? 问:如果我需要添加进度报告 – 我该怎么做? 我选择这种方法的原因是,后台工作者是这样我可以并行地按顺序启动每个数据库任务。 除此之外,我认为使用TPL可能会很有趣..但是,因为我找不到任何具体的例子,我在下面做了什么(多个任务)我觉得把它放在这里得到它可能会很好答案,希望成为其他人的榜样。 谢谢! 码: // Disable buttons and start the spinner btnSearch.Enabled = btnClear.Enabled = false; searchSpinner.Active = searchSpinner.Visible = true; // Setup scheduler TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext(); // Start the tasks Task.Factory.ContinueWhenAll( // Define the search tasks that return List new [] […]

当所有关于大量任务

我需要你的帮助才能找到最佳解决方案。 这是我的原始代码: public async Task Test() { var tasks = new List(); string line; using (var streamReader = File.OpenText(InputPath)) { while ((line = streamReader.ReadLine()) != null) { tasks.Add(Process(line)); } } await Task.WhenAll(tasks.ToArray()); } private Task Process(string line) { return Task.Run(() => { Console.WriteLine(line); }); } 它将读取带有行的文件并按任务处理每一行。 但是,如果文件有100万行,那么任务数组就更大了,这段代码还是不错的? 或者我应该找到另一个解决方案 请帮我。 谢谢。

使用任务的经典永无止境的线程循环?

给定是一种非常常见的线程场景: 宣言 private Thread _thread; private bool _isRunning = false; 开始 _thread = new Thread(() => NeverEndingProc()); thread.Start(); 方法 private void NeverEndingProc() { while(_isRunning) { do(); } } 可能在异步tcp侦听器中使用,它等待回调,直到它通过让线程用完而停止( _isRunning = false )。 现在我想知道:是否有可能与Task做同样的事情? 使用CancellationToken ? 或者仅针对预期结束和报告状态的程序的Task ?

异步方法不能并行运行

在下面的代码中,在B方法中,代码为Trace.TraceInformation(“B – Started”); 永远不会被召唤。 该方法应该并行运行吗? using System.Collections.Generic; using System.Diagnostics; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { private static async Task A() { for (;;) { } } private static async Task B() { Trace.TraceInformation(“B – Started”); } static void Main(string[] args) { var tasks = new List { A(), B() }; Task.WaitAll(tasks.ToArray()); } } […]

使用Parallel.ForEach()时防止远程系统过载

我们已经构建了这个需要在远程机器(实际上是MatLab服务器)上完成一些计算的应用程序。 我们使用Web服务连接到MatLab服务器并执行计算。 为了加快速度,我们使用了Parallel.ForEach() ,以便同时进行多个服务调用。 如果我们将ParallelOptions.MaxDegreeOfParallelism (DOP)设置为4或者其他东西非常保守,那么一切都运行良好。 但是,如果我们让框架决定DOP,它将产生如此多的线程,迫使远程机器跪下并开始超时(> 10分钟)。 我们如何解决这个问题? 我能够做的就是使用响应时间来限制呼叫。 如果响应时间小于30秒,请继续添加线程,一旦超过30秒,请使用更少的线程。 有什么建议? NB与此问题中的响应相关: https : //stackoverflow.com/a/20192692/896697

Task.WhenAll() – 它是否创建了一个新线程?

根据MSDN : 创建一个任务,该任务将在所有提供的任务完成后完成。 当调用Task.WhenAll()时,它会创建一个任务,但这是否意味着它创建了一个新线程来执行该任务? 例如,下面的控制台应用程序中创建了多少个线程? class Program { static void Main(string[] args) { RunAsync(); Console.ReadKey(); } public static async Task RunAsync() { Stopwatch sw = new Stopwatch(); sw.Start(); Task google = GetString(“http://www.google.com”); Task microsoft = GetString(“http://www.microsoft.com”); Task lifehacker = GetString(“http://www.lifehacker.com”); Task engadget = GetString(“http://www.engadget.com”); await Task.WhenAll(google, microsoft, lifehacker, engadget); sw.Stop(); Console.WriteLine(“Time elapsed: ” + sw.Elapsed.TotalSeconds); […]

为什么Task.WaitAny没有抛出exception?

在下面的代码中,“内部捕获块”从不打印。 尽管打印了“最后一行”。 为什么这样? 请帮忙。 Task task1 = Task.Factory.StartNew(() => { throw new Exception(“some exception”); }); try { Task.WaitAny(new Task[] { task1 }); } catch(Exception e) { Console.WriteLine(“Inside catch block.”); } Console.WriteLine(“Final line.”);

应该返回Task的方法抛出exception吗?

返回Task的方法有两个报告错误的选项: 立刻抛出exception 返回将以exception结束的任务 调用者是否应该期望两种类型的错误报告,或者是否有某些标准/协议将任务行为限制为第二个选项? 例: class PageChecker { Task CheckWebPage(string url) { if(url == null) // Argument check throw Exception(“Bad URL”); if(!HostPinger.IsHostOnline(url)) // Some other synchronous check throw Exception(“Host is down”); return Task.Factory.StartNew(()=> { // Asynchronous check if(PageDownloader.GetPageContent(url).Contains(“error”)) throw Exception(“Error on the page”); }); } } 处理这两种类型看起来很难看: try { var task = pageChecker.CheckWebPage(url); task.ContinueWith(t => […]

如何异步这个长时间运行的方法?

我有这种方法,我想异步运行,以便我可以在运行时做其他事情。 它不依赖于任何其他Async方法(它不会调用另一个资源,下载文件或任何东西)。 我想避免使用new Task() , Task.Factory.StartTask()和Task.Run() ,如果可能的话。 是否可以异步运行此方法,使用整洁,可读的代码并且不显式使用Task? 如果不是,那么异步运行该方法的最简单方法是什么? 注意:请不要关心方法中的愚蠢逻辑 – 我把它煮成故意慢但不显示我的实际代码。 public static void main(string[] args) { RunMySlowLogic(); } private void RunMySlowLogic() { while (true) for (int i=0; i<100000000;i++) if (i == new Random().Next(999)) return true; } 目前,我认为我需要将方法包装在lambda或Task中并将其标记为异步。 等待去哪儿了?

应该弃用Task.Wait吗?

我学到了从池线程调用Task.Wait会导致线程饥饿死锁的困难方法。 根据这篇MSDN文章 ,在“死锁”一章中,我们应遵守这两条规则: 不要创建任何同步方法等待异步函数的类,因为可以从池中的线程调用此类。 如果类阻塞等待异步函数,则不要在异步函数内使用任何类。 似乎唯一合法使用Task.Wait的地方是主要function – 我在这里夸大了一点,但你明白了。 为什么Task.Wait仍然是.NET框架的一部分,看它有多危险?