'RunSynchronously may not be called on a task not bound to a delegate, such as the task returned from an asynchronous method

I am tring to Scan document from my Application but excutution time my code stuck somewhere and Code did not worked. some time throw same error which I mention in Header. I given here my all code and also which I tried. This is part of my code

 private async void HomePageScanner()
    {
        try
        {
            string pdfFileName = string.Empty;
            pdfFileName = Guid.NewGuid().ToString() + ".pdf";
            //scanPdfFile = pdfFileName;
            StorageFolder scanTempFolder = await KnownFolders.PicturesLibrary.CreateFolderAsync(Constants.PATH_TEMP_SCAN, CreationCollisionOption.OpenIfExists);
            DeviceInformationDisplay selectedScanner = CmbScannerList.SelectedItem as DeviceInformationDisplay;

            string ScannerID = selectedScanner.Id;
            StorageFolder pdfFolder_DataFTP = await KnownFolders.PicturesLibrary.CreateFolderAsync(Constants.PATH_SCAN, CreationCollisionOption.OpenIfExists);
            //var task = Task.Run(async () => { await ScanToFolder(ScannerID, scanTempFolder, pdfFileName, pdfFolder_DataFTP, null); });
            //Task.Run(task);

            ScanToFolder(ScannerID, scanTempFolder, pdfFileName, pdfFolder_DataFTP, null).RunSynchronously();
            // await ScanToFolder(ScannerID, scanTempFolder, pdfFileName, pdfFolder_DataFTP, null);
        }
        catch (Exception ex)  { new ExceptionHelper().AddException(ex.Message, this.ToString(), "HomePageScanner"); }
    }


public async Task ScanToFolder(string deviceId, StorageFolder scanTempFolder, string pdfFileName, StorageFolder pdfFolder_dataFTP, StorageFolder pdfFolder_DataServer)
    {
        try
        {
            scanningDialog.ShowAsync();
            _scanerTimer.Tick += _scanerTimer_Tick;
            _scanerTimer.Interval = new TimeSpan(0, 0, 1);
            _scanerTimer.Start();                
            
            
           // ImageScanner myScanner = await ImageScanner.FromIdAsync(deviceId);
            ImageScanner myScanner = null;//=  ImageScanner.FromIdAsync(deviceId);
            await Task.Run(async () =>
            {
                myScanner = await ImageScanner.FromIdAsync(deviceId);
                // var task = Task.Run(async () => { myScanner = await ImageScanner.FromIdAsync(deviceId); 

                _isScanContinue = true;

                CancellationTokenSource source = new CancellationTokenSource();
                CancellationToken token = source.Token;

                if (myScanner.IsScanSourceSupported(ImageScannerScanSource.AutoConfigured))
                {
                    myScanner.FlatbedConfiguration.Format = ImageScannerFormat.Jpeg; //Code Stuck here some time

                    for (int i = 0; i < _totalPageToScan; i++)
                    {
                        _pageCounter++;

                        if (i > 0)
                        {
                            scanningDialog.IsEnabled = false;
                            //scanningDialog.Hide();
                            ContentDialog scanConfirmationDialog = new ContentDialog()
                            {
                                Title = "Click OK button to scan the next page of your document",
                                CloseButtonText = "OK"
                            };
                            scanConfirmationDialog.Closed += ScanConfirmationDialog_Closed;
                            await scanConfirmationDialog.ShowAsync();
                        }                                                                                
                    }
                }
            });
        }            
    }

 private void _scanerTimer_Tick(object sender, object e)
    {
        _scanCounter++;
        if (_scanCounter == 30)
        {
            if (_isScanContinue == false)
            {
                CommonCls.ShowToastMessage("Something went wrong. please check your scanner");
                this.Hide();
                scanningDialog.DataContext = "Something went wrong!!";
                scanningDialog.Hide();
            }
        }
    }

I updated Complete Please View and Help me to solve this. I hope a better solution which I needed most. Thank You



Solution 1:[1]

You should think object oriented: one object is the scanner, one object is the dialog. They have to be completely independent each other and communicate via a clear interface. You can start from the code below where I skipped all the real scanning logic.

class ScannerInfoEventArgs : EventArgs
{
    public string Message { get; set; }
    public string ButtonText { get; set; }
    public bool DialogEanbled { get; set; }
    public bool Close { get; set; }
}

class Scanner
{
    private int _totalPageToScan;
    private int _pageCounter;

    public event EventHandler<ScannerInfoEventArgs>? OnScannerInfo;

    public delegate void ScannerInfoEventHandler(object sender, ScannerInfoEventArgs e);

    public async Task HomePageScanner()
    {
        try
        {
            string pdfFileName = string.Empty;
            pdfFileName = Guid.NewGuid().ToString() + ".pdf";
            _totalPageToScan = 10; // or your calculation here
            _pageCounter = 0;
            await ScanToFolder("c:\\tempfolder", pdfFileName, "c:\\pdf_data", "c:\\data_server");
        }
        catch (Exception ex) 
        {
        }
    }

    public bool IsScanSourceSupported(string source)
    {
        // yuor logic here
        return true;
    }

    public enum ImageType
    { 
        png,
        jpeg
    }

    public ImageType imageType
    {
        get; set;
    }

    public async Task ScanToFolder(string scanTempFolder, string pdfFileName, string pdfFolder_dataFTP, string pdfFolder_DataServer)
    {
        try
        {
            await Task.Run(() =>
            {
                CancellationTokenSource source = new CancellationTokenSource();
                CancellationToken token = source.Token;

                if (this.IsScanSourceSupported("your parameter here"))
                {
                    this.imageType = ImageType.jpeg; //Code Stuck here some time

                    for (int i = 0; i < _totalPageToScan; i++)
                    {
                        _pageCounter++;

                        if (i > 0)
                        {
                            ScannerInfoEventArgs ev = new ScannerInfoEventArgs() { Message = "Click OK button to scan the next page of your document", ButtonText = "OK", DialogEanbled = false, Close = false };
                            OnScannerInfo?.Invoke(this, ev);
                            if (ev.Close)
                            {
                                break;
                            }
                        }
                        if (i == 30) // or something more meaningful condition
                        {
                            ScannerInfoEventArgs ev = new ScannerInfoEventArgs() { Message = "Something went wrong.please check your scanner", ButtonText = "OK", DialogEanbled = true, Close = true };
                            OnScannerInfo?.Invoke(this, ev);
                            break;
                        }
                    }
                }
            });
        }
        catch (Exception)
        { }
    }
}

class FakeDialog
{
    public void ShowDialog(object sender, ScannerInfoEventArgs e)
    {
        Console.WriteLine(e.Message);
        Console.WriteLine(e.ButtonText);
        string asw = Console.ReadLine();
        if (asw == "stop")
        {
            e.Close = true;
        }
    }
}

static class Program
{
    static async Task Main()
    {
        var scanner = new Scanner();
        var dialog = new FakeDialog();

        scanner.OnScannerInfo += dialog.ShowDialog;
        await scanner.HomePageScanner();
    
    }
}

You should keep just the idea of object separation and asyn/await patter. Hope this can be a starting point.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Marco Beninca