Tag: task parallel library

Task.ContinueWith()父任务不等待子任务完成

由于我在嵌套任务的上下文中理解了Task ,我真的不明白 – 为什么第二次打印之前的第3次打印? 即使我使用了Task.WaitAll(t) ,它Task.WaitAll(t)在第二行之前打印第3行。 码: public static void Main() { Task t = new Task( () => { Thread.Sleep(2000); Console.WriteLine(“1st print…”); }); t.ContinueWith( x => { Thread.Sleep(2000); Console.WriteLine(“2nd print…”); }, TaskContinuationOptions.OnlyOnRanToCompletion); t.Start(); Task.WaitAll(t); Console.WriteLine(“3rd print…”); Console.Read(); } 输出:

如何将HttpContext.Current传递给在.net中使用Parallel.Invoke()调用的方法

我有两个方法,它们使用HttpContext.Current来获取userID。 当我单独调用这些方法时,我得到userID,但是当使用Parallel.Invoke()调用相同的方法时,HttpContext.Current为null。 我知道原因,我只是在寻找可以访问HttpContext.Current的工作。 我知道这不是线程安全的,但我只想执行读操作 public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Display(); Display2(); Parallel.Invoke(Display, Display2); } public void Display() { if (HttpContext.Current != null) { Response.Write(“Method 1” + HttpContext.Current.User.Identity.Name); } else { Response.Write(“Method 1 Unknown” ); } } public void Display2() { if (HttpContext.Current != null) { Response.Write(“Method […]

为什么没有抓住这个例外?

我正在尝试运行以下代码: class Program { static void Main(string[] args) { var task = Task.Factory.StartNew(() => { throw new ApplicationException(“message”); }); try { task.ContinueWith(t => Console.WriteLine(“End”)); } catch (AggregateException aex) { Console.Write(aex.InnerException.Message); } } } 我预计Exception将被捕获​​在以下位置: catch (AggregateException aex) { Console.Write(aex.InnerException.Message); } 但这不会发生。 为什么会这样?

与BlockingCollection集成时,Parallel.ForEach停滞不前

我根据这个问题中的代码采用了我的并行/消费者实现 class ParallelConsumer : IDisposable { private readonly int _maxParallel; private readonly Action _action; private readonly TaskFactory _factory = new TaskFactory(); private CancellationTokenSource _tokenSource; private readonly BlockingCollection _entries = new BlockingCollection(); private Task _task; public ParallelConsumer(int maxParallel, Action action) { _maxParallel = maxParallel; _action = action; } public void Start() { try { _tokenSource = […]

使用嵌套的Parallel.For

考虑这个例子: var x = 0; for (var i = 0; i < 100; i++ ) { for (var a = i+1; a < 100; a++) x += 1; } 打印x时,我们总是得到4950.如果我要将其并行化怎么办? 这就是我想出的 Parallel.For(0, 100, i => Parallel.For(i + 1, 100, a => { x += 1; })); 但是,每次运行时都不打印4950。 为什么?

取消Dispose方法中的任务

我有一个类可以产生可以无限期运行的各种任务。 处理此对象时,我想阻止这些任务运行。 这是正确的方法: public class MyClass : IDisposable { // Stuff public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { queueCancellationTokenSource.Cancel(); feedCancellationTokenSource.Cancel(); } } }

如何在.net 4.0中获取正在运行的任务列表

我正在尝试获取所有当前正在运行的任务的列表。 .net 4.0任务API是否提供此类function? 或者唯一的选择是明确地将任务存储在单独的集合中?

使用自定义任务工厂创建但不启动任务?

我希望能够在不启动它的情况下创建任务,类似于运行var a = new Task(); a.Start(); var a = new Task(); a.Start(); 但是有一个定制工厂。 工厂提供StartNew() ,但我找不到分离这两个动作的方法。 这可能吗?

为什么在Parallel.ForEach中每个线程多次调用localInit Func

我正在编写一些代码来处理大量数据,我认为让Parallel.ForEach为它创建的每个线程创建一个文件是有用的,因此输出不需要同步(至少由我来)。 它看起来像这样: Parallel.ForEach(vals, new ParallelOptions { MaxDegreeOfParallelism = 8 }, ()=>GetWriter(), // returns a new BinaryWriter backed by a file with a guid name (item, state, writer)=> { if(something) { state.Break(); return writer; } List results = new List(); foreach(var subItem in item.SubItems) results.Add(ProcessItem(subItem)); if(results.Count > 0) { foreach(var result in results) result.Write(writer); } return […]

我被异步/等待宠坏了! 现在正在努力与明确的任务延续

编辑(接受后) 它可能不会立即显现,但@Servy的答案是正确的,而不需要在monodroid下自定义实现Unwrap – 在我的评论中我说它不存在,但它确实存在。 结束编辑 我正在编写一堆使用我们的RESTful Web服务的应用程序,尽管我认为我知道如何正确使用任务但事实并非如此。 场景是我已经为Windows Store实现了代码 – 使用async/await我需要为MonoDroid实现几乎相同的东西 – 没有那个(没有我不想使用的构建攻击)。 我已经将这个问题的问题归结为一组简单的异步获取整数的任务,然后,在继续中,触发另一个异步任务,转换从该整数构建的字符串。 在C#5中,这将是: 注意 – 当然我在这里使用Task.FromResult代替实际的异步代码 private async Task GetStringAsync() { return await GetStringFromIntAsync(await GetIntAsync()); } private async Task GetIntAsync() { return await Task.FromResult(10); } private async Task GetStringFromIntAsync(int value) { return await Task.FromResult(value.ToString()); } 要将此转换为基于延续的模式,我试过这个: private Task GetStringAsync() { //error on this […]