public async Task <int> AcquisitionAndInspectAsync(int surfaceTypeIndex) { // Acquisition Task.Run(() => _acquisitionStartedEvent.OnNext(surfaceTypeIndex)); var imageInfo = await _camera.AcquisitionAsync(); switch (surfaceTypeIndex) { case 0: Machine.Inspection_SurfaceFront_GrabFinishedPcEventDevice.WriteTrue(); break; case 1: Machine.Inspection_SurfaceBack_GrabFinishedPcEventDevice.WriteTrue(); break; } Task.Run(() => { _acquisitionCompletedEvent.OnNext(imageInfo.ToEntity()); _calibrationStartedEvent.OnNext(surfaceTypeIndex); }); // Calibration HImage calibImage; if (MachineConfig.MV_SimulationCalibrationEnabled) { calibImage = imageInfo.To8BppHImage(); } else { var swOriToHImageInfo = new NotifyStopwatch("imageInfo.To8BppHImage()"); HImage oriImage = imageInfo.To8BppHImage(); swOriToHImageInfo.Dispose(); // HImage reducedImage = oriImage.Rectangle1Domain(2000, 2000, 5000, 5000); var calib = new HalconImageCalibrator(); var swCalib = new NotifyStopwatch("AcquisitionAndInspectAsync.CalibrateImage(imageInfo)"); calibImage = calib.CalibrateImage(oriImage, MachineConfig.MV_CalibrationInterpolation); swCalib.Dispose(); oriImage.Dispose(); } var swCalibToImageInfo = new NotifyStopwatch("calibImage.ToImageInfo()"); var calibImageInfo = calibImage.ToImageInfo(); swCalibToImageInfo.Dispose(); calibImageInfo.SurfaceTypeIndex = surfaceTypeIndex; Debug.WriteLine("SurfaceType " + surfaceTypeIndex + ": StartGrabAsync() Finished"); Task.Run(() => { _calibrationCompletedEvent.OnNext(calibImageInfo.ToEntity()); _inspectionStartedEvent.OnNext(surfaceTypeIndex); }); Task.Run( () => { InspectInfo inspectionInfo; if (MachineConfigProvider.MachineConfig.MV_SimulationInspectorEnabled) { inspectionInfo = new InspectInfo(); calibImage.Dispose(); } else { InspectionResult inspectionResult; try { Debug.WriteLine("_inspectionController.Inspect() start"); var sw3 = new NotifyStopwatch("_inspectionController.Inspect()"); _inspectionController .SetInspectionSchema(_inspectionSchema.DeepClone()) .SetImage(calibImage) .CreateCoordinate() .Inspect(); Debug.WriteLine("_inspectionController.Inspect() OK"); sw3.Dispose(); calibImage.Dispose(); inspectionResult = _inspectionController.InspectionResult; } catch (Exception e) { MessageBox.Show("_inspectionController error.\n\n" + e.Message + "\n\n" + e.InnerException.Message); Debug.WriteLine("_inspectionController error.\n\n" + e.Message + "\n\n" + e.InnerException.Message); inspectionResult = new InspectionResult(); } Debug.WriteLine("_inspectionController.GetInspectionInfo() Start"); inspectionInfo = inspectionResult.GetInspectionInfo(_inspectionController.Coordinate); Debug.WriteLine("_inspectionController.GetInspectionInfo() OK"); } var surfaceInspectInfo = new SurfaceInspectInfo() { SurfaceTypeIndex = surfaceTypeIndex, ImageInfo = calibImageInfo.ToEntity(), InspectInfo = inspectionInfo, WorkpieceIndex = _inspectCounter / MachineConfigProvider.MachineConfig .MV_AcquisitionCountPerWorkpiece }; Task.Run(() => _inspectionCompletedEvent.OnNext(surfaceInspectInfo)); Debug.WriteLine("AcquisitionAndInspectAsync.HandleInspect() above"); HandleInspect(surfaceInspectInfo); }); return(calibImageInfo.Index); }