public Task StartTakePicture(int intervalMSec, CancellationTokenSource cancelTokenSource) { if (string.IsNullOrEmpty(photoFileNamePrefix)) { var css = ConnectionString.Split(";"); var devdef = css[1].Split("="); photoFileNamePrefix = devdef[1]; } lock (this) { takePhotoIntervalMSec = intervalMSec; } var tmpFileName = photoFileName + photoFileNameExt; var photoTakingTask = Task.Factory.StartNew(async() => { var capture = OpenCvSharp.VideoCapture.FromCamera(0); using (var win = new OpenCvSharp.Window()) using (var mat = new OpenCvSharp.Mat()) { while (true) { capture.Read(mat); win.ShowImage(mat); var now = DateTime.Now; if (File.Exists(tmpFileName)) { File.Delete(tmpFileName); } using (var fs = new FileStream(tmpFileName, FileMode.CreateNew)) { mat.WriteToStream(fs, photoFileNameExt, null); } var fileName = photoFileNamePrefix + now.ToString("yyyyMMddHHmmss") + photoFileNameExt; await UploadFile(fileName, new FileInfo(tmpFileName).FullName); var interval = 0; lock (this) { interval = takePhotoIntervalMSec; } await Task.Delay(interval); if (cancelTokenSource.IsCancellationRequested) { break; } } throw new OperationCanceledException(cancelTokenSource.Token); } }, cancelTokenSource.Token); return(photoTakingTask); }