简体   繁体   English

RunSynchronously 可能不会在未绑定到委托的任务上调用,例如从异步方法返回的任务

[英]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.有时会抛出我在 Header 中提到的相同错误。我在这里给出了我的所有代码以及我尝试过的代码。 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.我更新了 Complete Please View 并帮助我解决这个问题。 I hope a better solution which I needed most.我希望有一个我最需要的更好的解决方案。 Thank You谢谢你

You should think object oriented: one object is the scanner, one object is the dialog.你应该认为 object 面向:一个 object 是扫描仪,一个 object 是对话。 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.您应该只保留 object 分离和 asyn/await 模式的想法。 Hope this can be a starting point.希望这可以作为一个起点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM