我试图找出我在哪里做错了什么或者这是任务并行库额外的错误.下面的示例代码说明了我的场景(尽管非常简化).一旦取消注释,QueuedTaskScheduler.Dispose()原因Task.WaitAll()因为tasks数组包含状态中的几个(好的,大多数)任务而无限期地挂起WaitingToRun.
我的印象是QueuedTaskScheduler.Dispose()应该等待所有计划任务完成或完全中止它们.
任何想法如何修复现有行为都是受欢迎的.
[TestClass]
public class TestTPLX
{
[TestMethod]
public void CheckDisposeWorks()
{
var qts = new QueuedTaskScheduler();
var ts = qts.ActivateNewQueue(100);
var cts = new CancellationTokenSource();
var tasks = Enumerable.Range(0, 20).Select(_ => Task.Factory.StartNew(() =>
{
Thread.Sleep(10);
},
cts.Token, TaskCreationOptions.None, ts))
.ToArray();
cts.Cancel();
// test hangs when line below is uncommented
// qts.Dispose();
Task.WaitAll(tasks);
}
}
Run Code Online (Sandbox Code Playgroud)
更新:我设法解决了删除问题_disposeCancellation.IsCancellationRequested检查里面QueuedTaskScheduler …
我正在寻找最快的方法将数组拆分成固定大小的块(当然,最后一个可以更小).我在整个网站上看过并没有找到任何性能方面的比较,所以我写了它们,结果如下:
以微秒为单位的时间,均值/错误/ stddev
对于
int[]- 30.02 | 0.1002 | 0.0937对于
IEnumerable<int>- 76.67 | 0.2146 | 0.1902
更新:以下版本(在@Markus的回答中)是139.5 | 0.6702 | 0.5597
最受欢迎这里使用LINQ的SO和经常推荐的方法 GroupBy使用index/chunkSize是一个没有去- 267微秒是比任何上述实施方式也更大.
有没有更快的方法来分割数组?
PS这是代码Array和IEnumerable<T>:
/// <summary>
/// Splits <paramref name="source"/> into chunks of size not greater than <paramref name="chunkMaxSize"/>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source">Array to be split</param>
/// <param name="chunkMaxSize">Max size of chunk</param>
/// <returns><see cref="IEnumerable{T}"/> of <see cref="Array"/> of <typeparam name="T"/></returns>
public static …Run Code Online (Sandbox Code Playgroud)