Tag: 任务并行库

为什么CancellationToken与CancellationTokenSource分开?

我正在寻找为什么除CancellationTokenSource类之外还引入了.NET CancellationToken结构的基本原理。 我理解如何使用API​​,但也想明白为什么要这样devise。 也就是说,为什么我们有: var cts = new CancellationTokenSource(); SomeCancellableOperation(cts.Token); … public void SomeCancellableOperation(CancellationToken token) { … token.ThrowIfCancellationRequested(); … } 而不是直接传递CancellationTokenSource,如: var cts = new CancellationTokenSource(); SomeCancellableOperation(cts); … public void SomeCancellableOperation(CancellationTokenSource cts) { … cts.ThrowIfCancellationRequested(); … } 这是一个性能优化的基础上,取消状态检查发生比传递令牌更频繁的事实? 因此,CancellationTokenSource可以跟踪和更新CancellationToken,并且对于每个令牌,取消检查是本地字段访问? 在这两种情况下,如果一个不locking的volatile BOOL就足够了,我还是不明白为什么会更快。 谢谢!

等待多个任务结果不同

我有3个任务: private async Task<Cat> FeedCat() {} private async Task<House> SellHouse() {} private async Task<Tesla> BuyCar() {} 他们都需要运行之前我的代码可以继续,我也需要结果。 没有一个结果有任何共同之处 我如何打电话,等待3个任务完成,然后得到结果?

关于Task.Start()的使用,Task.Run()和Task.Factory.StartNew()

我刚刚看到了三个关于TPL使用的例程,它们做的是同样的工作 这里是代码 public static void Main() { Thread.CurrentThread.Name = "Main"; // Create a task and supply a user delegate by using a lambda expression. Task taskA = new Task( () => Console.WriteLine("Hello from taskA.")); // Start the task. taskA.Start(); // Output a message from the calling thread. Console.WriteLine("Hello from thread '{0}'.", Thread.CurrentThread.Name); taskA.Wait(); } public […]

创build一个完成的任务<T>

我正在实现一个方法Task<Result> StartSomeTask()并且恰好在调用方法之前知道结果。 如何创build已完成的任务<T> ? 这是我目前正在做的事情: private readonly Result theResult = new Result(); public override Task<Result> StartSomeTask() { var task = new Task<Result>(() => theResult); task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread); return task; } 有更好的解决scheme吗?

返回void和返回一个Task有什么区别?

在查看各种C#asynchronousCTP示例时,我看到一些返回voidasynchronous函数,以及其他返回非通用Taskasynchronous函数。 我可以看到为什么在asynchronous操作完成时返回一个Task<MyType>对于将数据返回给调用者是有用的,但是我所看到的具有返回typesTask的函数永远不会返回任何数据。 为什么不回报void ?

何时处置CancellationTokenSource?

CancellationTokenSource类是一次性的,快速查看reflection器certificate非常可能KernelEvent托pipe资源KernelEvent 。 它没有终结者,所以如果我们不处理,GC就不会这样做。 另一方面,如果您查看MSDN取消文章中的示例,则除了一个之外,所有代码片段都不会这样做。 在代码中find正确的位置和时间似乎很难。 如果你不等待,你不能用代码开始你的并行任务。 只有在不等待的情况下,取消才有意义。 当然,你可以用Dispose调用在任务上添加ContinueWith ,但是这是怎么回事? 关于可取消的PLINQ查询,哪些不同步,但只是在最后做些什么? 比方说.ForAll(x => Console.Write(x)) ? 它可重用吗? 我们可以重复使用相同的标记进行多个调用,然后将其与主机组件一起处理,让我们说UI控制? 因为它没有类似Reset方法来清理IsCancelRequested和Token字段,所以我认为它是不可重用的,因此每次启动任务(或PLINQ查询)时都应该创build一个新的。 这是真的吗? 如果是的话,我的问题是什么是正确的和build议的策略来处理这些许多CancellationTokenSource实例处理?

什么时候应该使用TaskCompletionSource <T>?

什么时候应该使用TaskCompletionSource? AFAIK,所有它知道的是,在某个时候,它的SetResult或SetException方法正在被调用来完成通过其Task属性公开的Task<T> 。 换句话说,它作为一个Task<TResult>及其完成的生产者。 我在这里看到了这个例子: 如果我需要一种方法来asynchronous执行一个Func,并有一个任务来表示该操作。 public static Task<T> RunAsync<T>(Func<T> function) { if (function == null) throw new ArgumentNullException(“function”); var tcs = new TaskCompletionSource<T>(); ThreadPool.QueueUserWorkItem(_ => { try { T result = function(); tcs.SetResult(result); } catch(Exception exc) { tcs.SetException(exc); } }); return tcs.Task; } 如果我没有Task.Factory.StartNew ,可以使用Task.Factory.StartNew 但我有Task.Factory.StartNew 。 有人可以请示例解释与TaskCompletionSource 直接相关的情况,而不是一个假设的情况下,我没有Task.Factory.StartNew ?

创build一个完成的任务

我想创build一个完成的Task (不是Task<T> )。 是否有内置的.NET来做到这一点? 一个相关的问题: 创build一个完成的任务<T>

同步调用asynchronous方法

我有一个async方法: public async Task<string> GenerateCodeAsync() { string code = await GenerateCodeService.GenerateCodeAsync(); return code; } 我需要从同步方法调用这个方法。 我怎样才能做到这一点,而不必重复GenerateCodeAsync方法,以使其同步工作? 更新 但没有find合理的解决办法 但是,我看到HttpClient已经实现了这种模式 using (HttpClient client = new HttpClient()) { // async HttpResponseMessage responseAsync = await client.GetAsync(url); // sync HttpResponseMessage responseSync = client.GetAsync(url).Result; }

在Moq框架中设置asynchronous任务callback

我有一个接口声明 Task DoSomethingAsync(); 我正在使用MoqFramework进行testing: [TestMethod()] public async Task MyAsyncTest() { Mock<ISomeInterface> mock = new Mock<ISomeInterface>(); mock.Setup(arg => arg.DoSomethingAsync()).Callback(() => { <my code here> }); … } 然后在我的testing中,我执行调用await DoSomethingAsync()的代码。 而testing只是在这一行失败。 我究竟做错了什么?