private static TaskScheduler CreateScheduler() { TaskScheduler scheduler = new IOTaskScheduler(); AppDomain.CurrentDomain.DomainUnload += CurrentDomainUnload; return(scheduler); }
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); }