[英]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.