C# 异步方法内部的事件处理

C# 异步方法内部的事件处理,c#,android,asynchronous,xamarin.android,zxing,C#,Android,Asynchronous,Xamarin.android,Zxing,我在MonoForAndroid中有一个活动,它利用Android扫描条形码。在扫描和返回结果方面,一切正常。然而,当我试图处理scanOverlay上的任何事件时,我得到了nullReferenceException。我的代码如下,任何帮助都将不胜感激 public async void StartScanSession(ScanSessionEventArgs e) { EnsureLoadingZxingOverlay(e); EnsureStartingZ

我在MonoForAndroid中有一个活动,它利用Android扫描条形码。在扫描和返回结果方面,一切正常。然而,当我试图处理scanOverlay上的任何事件时,我得到了nullReferenceException。我的代码如下,任何帮助都将不胜感激

public async void StartScanSession(ScanSessionEventArgs e)
{
        EnsureLoadingZxingOverlay(e);
        EnsureStartingZxingBarcodeScanner();            
        var zxingOptions = MobileBarcodeScanningOptions.Default;

        var result = await ZxingBarcodeScanner.Scan(zxingOptions);
        HandleScanResult(result, e);
 }

private void HandleScanResult(ZXing.Result result, ScanSessionEventArgs e)
{
    if (result != null && e.OnFinishCallBack != null)
    {
        var scanResult = new ScanResult { ShouldStopScanning = false, BarcodeText = result.Text, ScanTime = result.Timestamp, BarcodeFormat = result.BarcodeFormat.ToString(), RawBytes = result.RawBytes };
        e.OnFinishCallBack(scanResult);
    }
}

private void EnsureLoadingZxingOverlay(ScanSessionEventArgs e)
{
    if (ZxingOverlay == null)
    {
        ZxingOverlay = LayoutInflater.FromContext(this).Inflate(Resource.Layout.scan_custom_layout, null);
        ScanLayoutFlashButton = ZxingOverlay.FindViewById<Button>(Resource.Id.ScanLayoutFlashButton);
        ScanLayoutDoneButton = ZxingOverlay.FindViewById<Button>(Resource.Id.ScanLayoutDoneButton);

        UnhookZxingLayoutButtons();
        ScanLayoutFlashButton.Click += (sender, args) => ZxingBarcodeScanner.ToggleTorch();
        ScanLayoutDoneButton.Click += (sender, args) => HandleDoneButtonOnZxingScanLayout(e);
    }
}
例外情况详情如下

UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object at Leopard.Mobile.Screens.QVgaPortrait.MainScreen.HandleDoneButtonOnZxingScanLayout (Leopard.Mobile.Business.Event.ScanSessionEventArgs) [0x0001e] in ...\MainScreen.cs:178 at Leopard.Mobile.Screens.QVgaPortrait.MainScreen/c__DisplayClass8.b__6 (object,System.EventArgs) [0x00000] in ...\MainScreen.cs:156 at Android.Views.View/IOnClickListenerImplementor.OnClick (Android.Views.View) [0x0000d] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.10.1-branch/d23a19bf/source/monodroid/src/Mono.Android/platforms/android-14/src/generated/Android.Views.View.cs:1615 at Android.Views.View/IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ (intptr,intptr,intptr) [0x00011] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.10.1-branch/d23a19bf/source/monodroid/src/Mono.Android/platforms/android-14/src/generated/Android.Views.View.cs:1582 at (wrapper dynamic-method) object.49957671-33c0-4b79-8c3b-36f419ebfaaa (intptr,intptr,intptr) 未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例 位于Leopard.Mobile.Screens.qvgacrative.MainScreen.Handledone按钮NonZxingScanLayout(Leopard.Mobile.Business.Event.ScanSessionEventArgs)[0x0001e]in…\MainScreen.cs:178 在Leopard.Mobile.Screens.qvgacription.MainScreen/c__DisplayClass8.b_uu 6(对象,System.EventArgs)[0x00000]中…\MainScreen.cs:156 在/Users/builder/data/lanes/monodroid-mlion-monodroid-4.10.1-branch/d23a19bf/source/monodroid/src/Mono.Android/platforms/Android-14/src/generated/Android.Views.cs:1615中的Android.Views.View/IOnClickListenerImplementor.OnClick(Android.Views.View)[0x0000d] 在/Users/builder/data/lanes/monodroid-mlion-monodroid-4.10.1-branch/d23a19bf/source/monodroid/src/Mono.Android/platforms/Android/14/src/generated/Android.Views.cs:1582中的Android.Views.View/IOnClickListenerInvoker.n/IOnClickListenerInvoker.n上 at(包装器动态方法)对象49957671-33c0-4b79-8c3b-36f419ebfaaa(intptr、intptr、intptr)
由于声誉不佳,无法发表评论,因此在此处发布


我们遇到了另一个第三方应用程序超出范围的类似问题。您是否进行过任何级别的螺纹安全检查?可能您的ZxingBarcodeScanner只能通过创建它的线程访问,即称为“StartCassession”的线程。

我在设置
Zxing
库的方法和事件时没有发现任何问题。尤其是在
MonoTounch
上做了相同的设置之后,一切都很好。因此,我进入源代码,查看
scanner.Cancel()
方法在内部的作用。我发现它只调用了
ZxingActivity
上的
Cancel()
static
方法,所以我从我的代码中这样做了,似乎一切都很好。 这可能不是最优雅的解决方案,我已经在github()上的
Zxing.Net.Mobile
repo上报告了一个问题,但目前这是可行的,我希望它也能帮助其他人。我还有一篇完整的帖子,详细介绍了我在MonoDroid上使用这个库的经验,以防有人需要它

因此,修复程序正在替换这一行(来自上面的代码):

这一行:

ZxingActivity.RequestCancel();  

请发布异常详细信息,包括stacktrace。谢谢Stephen,在上面添加了异常详细信息
ZxingBarcodeScanner.Cancel();
ZxingActivity.RequestCancel();