I still don't understand why do you need thread-local list in a dataflow block. And you're right that TDF doesn't have any explicit support for thread-local values (the way Parallel.ForEach()
does). But that doesn't mean you can't use thread-local values, you'll just have to do everything manually, using ThreadLocal
(I think [ThreadStatic]
wouldn't work well here, because it doesn't allow you to track all thread-local instances). For example:
private static ThreadLocal<List<int>> threadLocalList;
private static void Main()
{
threadLocalList = new ThreadLocal<List<int>>(() => new List<int>(), true);
var block = new ActionBlock<int>(
(Action<int>)PerformAction,
new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 4 });
for (int i = 0; i < 10; i++)
block.Post(i);
block.Complete();
block.Completion.Wait();
foreach (var list in threadLocalList.Values)
Console.WriteLine(string.Join(", ", list));
threadLocalList.Dispose();
}
private static void PerformAction(int i)
{
threadLocalList.Value.Add(i * i);
}