Tag: task parallel library

“等待Task.Yield()”及其替代品

如果我需要推迟代码执行,直到UI线程消息循环的未来迭代之后,我可以这样做: await Task.Factory.StartNew( () => { MessageBox.Show(“Hello!”); }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); 这类似于await Task.Yield(); MessageBox.Show(“Hello!”); await Task.Yield(); MessageBox.Show(“Hello!”); 除此之外,如果我愿意,我可以选择取消任务。 在使用默认同步上下文的情况下,我可以类似地使用await Task.Run继续池线程。 事实上,我比Task.Run更喜欢Task.Factory.StartNew和Task.Run ,因为它们都明确定义了延续代码的范围。 那么,在什么情况下await Task.Yield()实际上是有用的?

.NET 4任务并行库可以使用COM对象吗?

这是“这是可能的,如果是这样,你能给我一个简单的例子,因为我找不到一个在线的吗?” 有点问题。 我有许多完全独立的(即“令人尴尬的并行”)进程,我想使用C#在.NET Framework 4中使用任务并行库并行运行。 其中一些过程需要使用可通过COM / OLE自动化访问的软件。 具体来说,有一个Parallel.Foreach()循环,它将任务从项目列表中分开,基本上在Parallel.Foreach中调用一个不同的函数来处理处理(因此这些函数中的一些使用COM库来工作)。 这可能吗? 谢谢。

有没有办法将任务并行库(TPL)与SQLDataReader一起使用?

我喜欢TPL中Parallel.For和Parallel.ForEach扩展方法的简单性。 我想知道是否有办法利用类似的东西,甚至是稍微高级的任务。 下面是SqlDataReader的典型用法,我想知道是否可能,如果是这样,如何用TPL中的东西替换下面的while循环。 因为读者无法提供固定数量的迭代,所以不能使用For扩展方法,这样就可以处理我将收集的任务。 我希望有人可能已经解决了这个问题,然后在ADO.net上做了一些事情。 using (SqlConnection conn = new SqlConnection(“myConnString”)) using (SqlCommand comm = new SqlCommand(“myQuery”, conn)) { conn.Open(); SqlDataReader reader = comm.ExecuteReader(); if (reader.HasRows) { while (reader.Read()) { // Do something with Reader } } }

Task.WaitAll挂起了ASP.NET中的多个等待任务

下面是我遇到问题的代码的简化版本。 当我在控制台应用程序中运行它时,它按预期工作。 所有查询都是并行运行的, Task.WaitAll()在完成后返回。 但是,当此代码在Web应用程序中运行时,请求才会挂起。 当我附加一个调试器并中断所有时,它表明执行是在Task.WaitAll()上等待。 第一项任务已经完成,但其他任务都没有完成。 我无法弄清楚它在ASP.NET中运行时挂起的原因,但在控制台应用程序中运行良好。 public Foo[] DoWork(int[] values) { int count = values.Length; Task[] tasks = new Task[count]; for (int i = 0; i < count; i++) { tasks[i] = GetFooAsync(values[i]); } try { Task.WaitAll(tasks); } catch (AggregateException) { // Handle exceptions } return … } public async Task GetFooAsync(int value) […]

区分超时与用户取消

HttpClient具有内置超时function(尽管全部是异步的,即超时可以被认为是与http请求function正交,因此可以由通用异步实用程序处理,但除此之外)并且当超时启动时,它将抛出TaskCanceledException (包装在AggregateException )。 TCE包含一个等于CancellationToken.None 。 现在,如果我向HttpClient提供我自己的CancellationToken并使用它取消操作在它完成(或超时)之前,我得到完全相同的TaskCanceledException ,再次使用CancellationToken.None 。 是否还有一种方法, 通过仅查看抛出的exception ,找出超时是否取消了请求,而不必让我自己的CancellationToken可以访问检查exception的代码? PS这可能是一个错误,并且CancellationToken错误地修复了CancellationToken.None吗? 在取消使用自定义CancellationToken的情况下,我希望TaskCanceledException.CancellationToken等于该自定义标记。 编辑为了使问题更加清晰,通过访问原始的CancellationTokenSource ,可以很容易地区分超时和用户取消: origCancellationTokenSource.IsCancellationRequested == true 从exception中获取CancellationToken虽然给出了错误的答案: ((TaskCanceledException)e.InnerException).CancellationToken.IsCancellationRequested == false 这是一个最小的例子 ,由于受欢迎的需求: public void foo() { makeRequest().ContinueWith(task => { try { var result = task.Result; // do something with the result; } catch (Exception e) { TaskCanceledException innerException = e.InnerException as TaskCanceledException; bool […]

如何(以及如果)使用TPL编写单个使用者队列?

我最近听说过很多关于.NET 4.0中TPL的播客。 他们中的大多数使用任务描述后台活动,如下载图像或进行计算,以便工作不会干扰GUI线程。 我工作的大多数代码都有更多的多生产者/单一消费者风格,其中来自多个来源的工作项必须排队,然后按顺序处理。 一个示例是日志记录,其中来自多个线程的日志行被顺序化为单个队列,以便最终写入文件或数据库。 来自任何单一来源的所有记录必须保持有序,并且来自同一时刻的记录应该在最终输出中彼此“接近”。 因此,多个线程或任务或任何调用队列的任何东西: lock( _queue ) // or use a lock-free queue! { _queue.enqueue( some_work ); _queueSemaphore.Release(); } 专用工作线程处理队列: while( _queueSemaphore.WaitOne() ) { lock( _queue ) { some_work = _queue.dequeue(); } deal_with( some_work ); } 将工作线程专门用于这些任务的消费者方面似乎总是合理的。 我应该使用TPL中的某些构造来编写未来的程序吗? 哪一个? 为什么?

在反应流水线中执行TPL代码并通过测试调度程序控制执行

我很难理解以下测试不起作用的原因: [Fact] public void repro() { var scheduler = new TestScheduler(); var count = 0; // this observable is a simplification of the system under test // I’ve just included it directly in the test for clarity // in reality it is NOT accessible from the test code – it is // an implementation detail […]

如何访问阻塞集合的基础默认并发队列

我有多个生产者和一个消费者。 但是,如果队列中存在尚未消耗的内容,则生产者不应再次对其进行排队。 (唯一没有重复的阻塞集合使用默认的并发队列) if (!myBlockingColl.Contains(item)) myBlockingColl.Add(item) 但是,阻塞coll没有包含方法,也没有提供任何类型的trypeek()方法。 如何访问底层并发队列,以便我可以做类似的事情 if (!myBlockingColl.myConcurQ.trypeek(item) myBlockingColl.Add(item) 尾巴旋转。 请帮忙。 谢谢

Task.WaitAll不等待子任务?

你好我有_noOfThreads作为定义的任务一次运行。 所以我继续使用%运算符继续执行任务,在循环结束时我有Tasks.WaitAll 。 这是代码片段。 for (int index = 0; index < count; index++) { if (index { foo.bar(); }, TaskContinuationOptions.AttachedToParent); } Task.WaitAll(tasks); 但是,我注意到它不等待子任务完成。 父任务完成后, Task.WaitAll执行后的下一行。 如何更改此代码以等待子任务?

为什么抛出TaskCanceledException并且不会总是进入调试器

我正在深入研究async-await机制并观察到抛出一个我无法解释的TaskCanceledException 。 在下面的示例中(自包含)我有声明 await Task.Run(() => null); 我知道这个语句本身是无用的,但我把问题分开了,真正的代码有逻辑,在某些情况下返回null。 为什么抛出TaskCanceledException ? 如果我返回一个任意数字(在下面的例子中为5),它就不会抛出。 此外,如果我await该方法VS的调试器中断,但如果我不await它,则只有一条消息被写入VS的输出窗口。 internal class Program { private static void Main(string[] args) { var testAsync = new TestAsync(); // Exception thrown but the debugger does not step in. Only a message is logged to the output window testAsync.TestAsyncExceptionOnlyInTheOutputWindow(); // Exception thrown and the debugger breaks testAsync.TestAsyncExceptionBreaksIntoTheDebugger(); […]