Tag: 任务

使用Task并行计算递归算法

如何使用任务将此顺序递归算法转换为并行递归算法? public static List s = new List(); // random integers, array size is n public static List p = new List(); // random integers, array size is n public static int n = 100; public static int w = 10; static void Main(string[] args) { G1(n, w) } private static int G1(int k, int […]

任务不等待ContinueWith完成

我有控制台应用程序和代码如下, 我的问题是在ContinueWith任务完成之前,控制台应用程序结束,它没有等待continueWith完成,请指教。 请让我知道我遗漏或错误。 var task1 = Task.Factory.StartNew(() => DoProcess()); task1 .ContinueWith( t1 => updateSuccess(), TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.ExecuteSynchronously); task1 .ContinueWith( t => updateFault(), TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously); task1.Wait();

将值参数传递给c#中的Task

我有一个问题,将long by值传递给Task。 我有一个ID列表,我遍历每个ID,分配给一个局部变量,然后作为参数传递给一个新的任务。 在循环并处理下一个ID之前,我不等待任务完成。 我保留了一系列任务,但这无关紧要。 loop long ID = list[index]; task[index] = Task.Factory.StartNew(() => doWork(ID)); end loop 如果列表包含例如100和200.我希望第一个任务调用100,然后第二个任务调用200.但它没有,doWork接收200两个任务,因此复制值时出现问题。 我可以用一些简单的控制台代码演示 class Program { static void Main(string[] args) { long num = 100; Task one = Task.Factory.StartNew(() => doWork(num)); num = 200; Console.ReadKey(); } public static void doWork(long val) { Console.WriteLine(“Method called with {0}”, val); } } […]

CPU绑定任务的并行化继续IO绑定

我正在试图找到一种很好的方法来进行大数据集处理的代码并行化,然后将结果数据导入RavenDb。 数据处理受CPU限制,数据库导入IO绑定。 我正在寻找一个解决方案,在Environment.ProcessorCount线程上并行处理。 然后,应将结果数据导入到x(简称10)池中的RavenDb中并行处理上述过程。 这里的主要内容是我希望在导入完成数据时继续处理,以便在等待导入完成时继续处理下一个数据集。 另一个问题是成功导入后需要丢弃每批的内存,因为私有工作内存可以轻松达到> 5GB。 下面的代码是我到目前为止所得到的。 请注意,它没有满足上面列出的并行化要求。 datasupplier.GetDataItems() .Partition(batchSize) .AsParallel() .WithDegreeOfParallelism(Environment.ProcessorCount) .ForAll(batch => { Task.Run(() => { … } } GetDataItem生成分区为批处理数据集的可枚举数据项。 GetDataItem将产生约2,000,000个项目,每个项目平均大约0.3ms进行处理。 该项目在x64平台上运行在最新的.NET 4.5 RC上。 更新。 我当前的代码(见上文)将获取项目并批量分区。 每个批处理在八个线程上并行处理(i7上的Environment.ProcessorCount)。 处理速度慢,CPU限制和内存密集。 完成单个批处理后,将启动一个任务,将结果数据异步导入RavenDb。 批量导入作业本身是同步的,如下所示: using (var session = Store.OpenSession()) { foreach (var data in batch) { session.Store(data); } session.SaveChanges(); } 这种方法存在一些问题: 每次批处理完成时,都会启动任务以运行导入作业。 我想限制并行运行的任务数量(例如,max 10)。 此外,即使启动了许多任务,它们似乎也不会并行运行。 内存分配是一个巨大的问题。 […]

继续在主线程上执行任务

如果这是一个简单的问题,请原谅我; 我不能用足够通用的方式来表达它来搜索答案。 考虑以下代码: var task = Task.Factory.StartNew(() => Whatever()); task.ContinueWith(Callback, TaskScheduler.FromCurrentSynchronizationContext()) 回调方法执行时究竟如何确定? 它会等到主线程当前完成正在做的事情,还是在异步调用完成后立即调用? 并且这个回调是否会在主线程返回之前执行的任何操作之前完全执行?

使用Action 多个参数创建任务

我想在包含Action的Task中添加多个参数。 我回顾了现有的堆栈溢出问题使用Action 创建任务 请帮助我如何在任务中的Action方法中传递多个参数 Action action = (string msg, int count) => { Task.Factory.StartNew(async () => { await LoadAsync(msg, count); }); }; Task task = new Task(action, ….); 行动方法是 public static async Task LoadAsync(string message, int count) { await Task.Run(() => { Thread.Sleep(1500); }); Console.WriteLine(“{0} {1} Exceuted Successfully !”, message ?? string.Empty, (count == 0) […]

Task.WaitAll冻结应用程序C#

我想尝试Threading.Task(C#)并行运行一些工作。 在这个简单的例子中,我有一个带进度条和按钮的表单。 单击时,将调用RunParallel函数。 没有Task.WaitAll()它似乎运行良好。 但是,使用WaitAll语句,表单显示并且没有任何反应。 我不明白我在下面的设置中做错了什么。 提前致谢。 public partial class MainWindow : Form { public delegate void BarDelegate(); public MainWindow() { InitializeComponent(); } private void button_Click(object sender, EventArgs e) { RunParallel(); } private void RunParallel() { int numOfTasks = 8; progressBar1.Maximum = numOfTasks; progressBar1.Minimum = 0; try { List allTasks = new List(); for (int […]

为什么在继续使用其他内容时取消原始任务?

自从我潜入C#编程以来已经有4周了。 这真的很有趣,然而,我的屁股很痛苦: 当我单独用HttpClient.PostAsync()启动一个任务时,它工作正常。 但如果我继续其他事情,原始任务将被取消,而不是我。 看起来这个任务不乐意继续下去。 Task task0; Task task1; using (var client = new HttpClient()) { HttpContent content = new ByteArrayContent(new byte[]{}); task0 = client.PostAsync(“”, content); task1 = task0.ContinueWith((t) => { // Do nothing }); } task1.Wait(); // I got task0.IsCanceled == true here 我试过了: 1, task0.wait()之后立即添加task0.wait()将解决问题,但这不是我想要的。 因为我需要异步的性能优势并且这样做会使它完全同步。 2,在task0.wait()之前添加task0.wait() task1.wait()将导致TaskCanceledExcpetion 。 3,删除task0并等待task0 。 4,调用task0.start()将得到“可能不会在promise风格的任务上调用Start”。 所以,有人告诉我,我做错了什么? […]

如果任务尚未启动,调用Task.wait可能不会等待?

我正在通过c#书阅读Jeffrey Richter的clr并感到不舒服,因为任务等待可能并不总是等待我引用 “当一个线程调用Wait方法时,系统会检查线程正在等待的Task是否已经开始执行。如果有,则调用Wait的线程将阻塞,直到Task完成运行。但是如果Task没有启动执行,然后系统可以(取决于TaskScheduler)使用调用Wait的线程执行Task。如果发生这种情况,那么调用Wait的线程不会阻塞;它执行Task并立即返回。 有人可以分享更多的见解,在这种情况下可能会出现这种情况吗?

C#启动计划任务

我正在尝试在c#中编写一个简单的表单,它将在某些计算机上运行计划任务。 到目前为止我是: private void button_Click(object sender, EventArgs e) { try { for (int i = 0; i < num_of_computers; i++) { string line; line = (" /run /tn myTask /s " + _ReplacerObj.MyComputers[i] + " /u user s /p password"); proc.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized; proc.FileName = @"C:\WINDOWS\SYSTEM32\schtasks.exe"; proc.Arguments = line; Process.Start(proc); } } catch (Exception ex) […]