private static TaskScheduler CreateScheduler()
        {
            TaskScheduler scheduler = new IOTaskScheduler();

            AppDomain.CurrentDomain.DomainUnload += CurrentDomainUnload;

            return(scheduler);
        }
Beispiel #2
0
        public ImagePlayer(
            int threadsIO,
            int threadsTexture,
            ILogger logger,
            IOTaskScheduler ioTaskScheduler,
            MemoryPool memoryPool,
            TexturePool texturePool,
            IDXDeviceService deviceService
            )
        {
            FThreadsIO      = threadsIO;
            FThreadsTexture = threadsTexture;
            FLogger         = logger;

            FTexturePool   = texturePool;
            FMemoryPool    = memoryPool;
            FDeviceService = deviceService;

            FFrameInfoBuffer = new BufferBlock <FrameInfo>();

            var filePreloaderOptions = new ExecutionDataflowBlockOptions()
            {
                MaxDegreeOfParallelism = threadsIO <= 0 ? DataflowBlockOptions.Unbounded : threadsIO,
                TaskScheduler          = ioTaskScheduler,
                BoundedCapacity        = threadsIO <= 0 ? DataflowBlockOptions.Unbounded : 2 * threadsIO
            };

            FFilePreloader = new TransformBlock <FrameInfo, Tuple <FrameInfo, Stream> >(
                (Func <FrameInfo, Tuple <FrameInfo, Stream> >)PreloadFile,
                filePreloaderOptions
                );

            var framePreloaderOptions = new ExecutionDataflowBlockOptions()
            {
                MaxDegreeOfParallelism = threadsTexture <= 0 ? DataflowBlockOptions.Unbounded : threadsTexture
            };

            FFramePreloader = new TransformBlock <Tuple <FrameInfo, Stream>, Frame>(
                (Func <Tuple <FrameInfo, Stream>, Frame>)PreloadFrame,
                framePreloaderOptions
                );

            var linkOptions = new DataflowLinkOptions()
            {
                PropagateCompletion = true
            };

            FFrameInfoBuffer.LinkTo(FFilePreloader, linkOptions);
            FFilePreloader.LinkTo(FFramePreloader, linkOptions);

            FDeviceService.DeviceDisabled += HandleDeviceDisabledOrRemoved;
            FDeviceService.DeviceRemoved  += HandleDeviceDisabledOrRemoved;

            Directories = new Spread <string>(0);
            Filemasks   = new Spread <string>(0);
        }