Although this is not possible directly with xUnit, you can get around this if you need to. With drawbacks, you must manually determine the number of parallel executions through classes, so if you want to parallelize it across two threads, you need to create two classes.
public abstract class ParellelTheoryBase { public static List<int> testValues = new List<int> {1, 2, 3, 4, 5, 6}; } public class ParallelTheory_1of2 : ParellelTheoryBase { public static List<object[]> theoryData = testValues.Where((data, index) => index % 2 == 0).Select(data => new object[] { data }).ToList(); [Theory] [MemberData(nameof(theoryData))] public void DoSomeLongRunningAddition(int data) { Assert.True(data < 7); Thread.Sleep(5000); } } public class ParallelTheory_2of2 : ParellelTheoryBase { public static List<object[]> theoryData = testValues.Where((data, index) => index % 2 == 1).Select(data => new object[] { data }).ToList(); [Theory] [MemberData(nameof(theoryData))] public void DoSomeLongRunningAddition(int data) { Assert.True(data < 7); Thread.Sleep(5000); } }
In this example, I defined a property in ParellelTheoryBase , which is the base class for real test classes. Then ParallelTheory_1of2 and ParallelTheory_2of2 inherit access to testValues from this class. Now Theory uses this theoryData to run the test, and it selects only data with odd or even ( index % 2 == 1 or index % 2 == 0 ) from the list.
It gets into the Visual Studio Test Explorer: 
And executed in parallel:
[xUnit.net 00:00:00.3397963] Starting [xUnit.net 00:00:15.5696617] Finished
This may be the solution when it is not easy for you to know in advance how much test data you have. I use this, for example, when integrating file parser testing, where the input is any file in the directory, and new new files will be automatically selected for tests.
In your example, I think you can easily change the MyTestData attribute to accept the parameters for totalCountParallels and currentIndex .