//TODO: implement
        //- PROGRESS BAR: injecting new Progress<int>(p => pbDownloadProgress.Value = p)
        //- CANCELLATION ACTION: 'Convert' button changes a label("Cancel") and to CLICL is attached a RoutedEventHandler CancelConversion_Click() while TASK in progress
        private void BtnConvertImage_Click(object sender, RoutedEventArgs e)
        {
            string nano, mili;
            bool   isHighResolution;

            btnLoad.IsEnabled = false;

            OperationsTimer.StartMeasurement();

            var originalImage = (imgPhotoOrginal.Source as BitmapImage);

            try
            {
                if (cbAsync.IsChecked == false)
                {
                    imgPhotoConverted.Source = originalImage.ToBitmap().ToGrayscale(cts.Token).ToBitmapImage();
                }
                else
                {
                    cts.CancelAfter(TimeSpan.FromSeconds(1));
                    //BitmapImage result = await Task.Run(() => {
                    //    return originalImage.ToBitmap().ToGrayscale(cts.Token).ToBitmapImage();
                    //});
                    //imgPhotoConverted.Source = result;

                    //<!--!> BELOW is other 'working' implementation using ThreadPool in scenario when TASK(Promise) is returned from diff Thread/Context - it is less elegant(requires a delegation of following tasks into UI SynchronizationContext) but I think it is worth mentioning:

                    var sc = SynchronizationContext.Current;

                    ThreadPool.QueueUserWorkItem(async delegate
                    {
                        // work on ThreadPool
                        var cts            = new CancellationTokenSource();
                        BitmapImage result = await ImageProcessing.GreyscaleAsync(orginalImage, cts.Token);
                        result.Freeze();

                        sc.Post(delegate
                        {
                            // work on the original context (UI)
                            imgPhotoConverted.Source = result;
                            cts.Cancel();

                            (nano, mili, isHighResolution) = OperationsTimer.StopMeasurement();

                            lblPerformance.Content = String.Concat("Total time: ", String.Concat(nano, " ns | "), String.Concat(mili, " ms | "), String.Concat("HiRes: ", isHighResolution ? "Enabled" : "Disabled"));
                        }, null);
                    });