Это может сработать:
Delegate dataGetCallback = new Func<Index3, Index3, float[,,]>(GetData);
void IGenerator.Calculate(ISubCube[] inputs, ISubCube[] outputs, Index3 min, Index3 max) {
float[,,] data = (float[,,])CoreSystem.SynchronizedInvoke.Invoke(getDataCallback, new[] { min, max });
MyAlgorithm(outputs, data, min, max);
}
float[,,] GetData(Index3 min, Index3 max) {
return inputDataNotPassedAsArgument.GetSubCube(min, max).ToArray();
}
Рассмотрим вариант CoreSystem.SynchronizedInvoke.BeginInvoke вместо Invoke, который работает синхронно. BeginInvoke позволит вам поработать над «вашим» потоком, пока вы ждете, когда станут доступны данные.
Предупреждение: я не пробовал это.