C# 如何正确等待我的条形码扫描

C# 如何正确等待我的条形码扫描,c#,xamarin.forms,async-await,zxing.net,C#,Xamarin.forms,Async Await,Zxing.net,目前我正在努力等待我的二维码: private async Task<string> ScanQRCode() { try { var options = new MobileBarcodeScanningOptions { AutoRotate = false, UseFrontCameraIfAvailable = false,

目前我正在努力等待我的二维码:

private async Task<string> ScanQRCode()
    {
        try
        {
            var options = new MobileBarcodeScanningOptions
            {
                AutoRotate = false,
                UseFrontCameraIfAvailable = false,
                TryHarder = true,
                DelayBetweenContinuousScans = 1
            };
            var scanPage = new ZXingScannerPage(options)
            {
                DefaultOverlayTopText = "Align the barcode within the frame",
                DefaultOverlayBottomText = string.Empty,
                DefaultOverlayShowFlashButton = true
            };

            string barcodestring = string.Empty;

            // Navigate to our scanner page
            Device.BeginInvokeOnMainThread(async () =>
            {
                await _navigation.PushModalAsync(scanPage);
            });

            scanPage.OnScanResult += (result) =>
            {
                if (result.Text.IsValidJson<DeviceSetup>())
                {
                    // Stop scanning
                    scanPage.IsScanning = false;

                    // Pop the page and show the result
                    Device.BeginInvokeOnMainThread(async () =>
                    {
                        await _navigation.PopModalAsync(true);
                    });
                    barcodestring = result.Text;
                }
            };

            return barcodestring;
        }
        catch (System.Exception ex)
        {
            Device.BeginInvokeOnMainThread(async () =>
            {
                await _navigation.PopModalAsync(true);
                await _page.DisplayAlert("Error", ex.Message, "OK");
            });
            return "Error";
        }
    }
专用异步任务ScanQRCode()
{
尝试
{
var选项=新的MobileBarcodeScanningOptions
{
自动旋转=错误,
UseFrontCameraIfAvailable=false,
TryHarder=true,
DelayBetweenContinuousScans=1
};
var scanPage=新ZXingScannerPage(选项)
{
DefaultOverlayTopText=“在框架内对齐条形码”,
DefaultOverlyBottomText=string.Empty,
DefaultOverlyShowFlashButton=true
};
string barcodestring=string.Empty;
//导航到我们的扫描仪页面
Device.beginInvokeMainThread(异步()=>
{
wait_navigation.PushModalAsync(scanPage);
});
scanPage.OnScanResult+=(结果)=>
{
if(result.Text.IsValidJson())
{
//停止扫描
scanPage.IsScanning=false;
//弹出页面并显示结果
Device.beginInvokeMainThread(异步()=>
{
wait_navigation.PopModalAsync(true);
});
barcodestring=result.Text;
}
};
返回条码字符串;
}
catch(System.Exception-ex)
{
Device.beginInvokeMainThread(异步()=>
{
wait_navigation.PopModalAsync(true);
等待页面显示警报(“错误”,例如消息“确定”);
});
返回“错误”;
}
}
调用方法继续执行,不等待QR结果


为什么?我想你的问题是你的

await _navigation.PushModalAsync(scanPage)
当扫描页被可视化时结束。那么你的

return barcodestring;
我认为返回的总是空字符串

你应该使用信息中心

            if (result.Text.IsValidJson<DeviceSetup>())
            {
                // Stop scanning
                scanPage.IsScanning = false;

                // Pop the page and show the result
                Device.BeginInvokeOnMainThread(async () =>
                {
                    await _navigation.PopModalAsync(true);
                });

                // Here send a message
                MessagingCenter.Send<MyPage, string>(this, "BarcodeRead", result.Text);
                //barcodestring = result.Text;
            }
if(result.Text.IsValidJson())
{
//停止扫描
scanPage.IsScanning=false;
//弹出页面并显示结果
Device.beginInvokeMainThread(异步()=>
{
wait_navigation.PopModalAsync(true);
});
//给你发个信
MessagingCenter.Send(这是“条形码读取”,result.Text);
//barcodestring=result.Text;
}
而且你的MyPage应该(在OnAppearing中)有如下内容

MessagingCenter.Subscribe<MyPage, string> (this, "BarcodeRead", (sender, arg) => {
    // arg should have your barcode...
});
MessagingCenter.Subscribe(此“条形码读取”(发件人,arg)=>{
//arg应该有您的条形码。。。
});

我创建了一个小演示。这是对

上演示的重拍,因为您订阅了
OnScanResult
事件并立即
返回barcodestring
?看,要不然就完蛋了。。谢谢你的链接。我将努力实现这一点!