UIKit.UIKitThreadAccessException: UIKit Consistency error: 您正在调用只能从 UI 线程调用的 UIKit 方法 [英] UIKit.UIKitThreadAccessException: UIKit Consistency error: you are calling a UIKit method that can only be invoked from the UI thread

查看:28
本文介绍了UIKit.UIKitThreadAccessException: UIKit Consistency error: 您正在调用只能从 UI 线程调用的 UIKit 方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试运行此代码:

I'm trying to run this code:

GetRepsButton.Command = new Command(async () =>
            {
                var url = @"https://url";

                HttpClient client = new HttpClient();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                //crashes here
                var test = await client.GetStringAsync(url);
            });

当我这样做时,整个应用程序崩溃并且输出窗口显示此错误:

And when I do, the entire app crashes and the output window shows this error:

ROR: +[MSWrapperLogger MSWrapperLog:tag:level:]/7 Unhandled Exception:
UIKit.UIKitThreadAccessException: UIKit Consistency error: you are calling a UIKit method that can only be invoked from the UI thread.
  at UIKit.UIApplication.EnsureUIThread () [0x00020] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.6.0.16/src/Xamarin.iOS/UIKit/UIApplication.cs:89 
  at UIKit.UIGestureRecognizer.RemoveTarget (Foundation.NSObject target, System.IntPtr action) [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.6.0.16/src/Xamarin.iOS/UIKit/UIGestureRecognizer.g.cs:342 
  at UIKit.UIGestureRecognizer.OnDispose () [0x00016] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.6.0.16/src/Xamarin.iOS/UIKit/UIGestureRecognizer.cs:41 
  at UIKit.UIGestureRecognizer.Dispose (System.Boolean disposing) [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.6.0.16/src/Xamarin.iOS/UIKit/UIGestureRecognizer.g.cs:959 
  at
 Foundation.NSObject.Finalize () [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.6.0.16/src/Xamarin.iOS/Foundation/NSObject2.cs:143 
Resolved pending breakpoint at 'SelectRep.xaml.cs:110,1' to void NameSpace.<ClientPicker_SelectedIndexChanged1>d__3.MoveNext () [0x0000c].

虽然我不认为我应该这样做,因为我没有对 UI 做任何事情,但我尝试过 InvokeOnMainThread 但它不起作用.我还尝试更改为 .Result 而不是 await,并且我尝试了 GetAsync 并读取内容,以及使用 WebClient 而不是 HttpClient.所有这些都会导致同样的错误.

Although I dont think I should have to since i'm not doing anything with the UI, I have tried InvokeOnMainThread which does not work. I've also tried changing to .Result instead of await, and I've tried GetAsync and reading the content, along with using WebClient instead of HttpClient. All cause this same error.

有什么想法吗?我使用的是 Xamarin 表单 4 前 7.

Any ideas? I'm using Xamarin forms 4 pre 7.

推荐答案

Use Device.BeginInvokeOnMainThread

Use Device.BeginInvokeOnMainThread

Device.BeginInvokeOnMainThread(() =>
{
  //your code
});

https:///docs.microsoft.com/en-us/dotnet/api/xamarin.forms.device.begininvokeonmainthread?view=xamarin-forms

这篇关于UIKit.UIKitThreadAccessException: UIKit Consistency error: 您正在调用只能从 UI 线程调用的 UIKit 方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆