Xamarin Android上异步任务中的SIGSEV

Xamarin Android上异步任务中的SIGSEV,android,mono,xamarin,xamarin.android,segmentation-fault,Android,Mono,Xamarin,Xamarin.android,Segmentation Fault,在我们当前针对Android的Xamarin项目中,我们在mono rt中看到了大量用于异步任务的SIGSEGV。下面是一个这样的示例代码,它生成了大约20%的SIGSEGV时间。看起来我在做一些根本错误的事情,或者Xamarin在Android上有一些严重的问题。有人能帮我指出生成这个SIGSEGV的代码有什么问题吗 这与什么有关 编辑:我现在在应用程序中看到了这种行为。这是一个有其他错误的。所有崩溃都发生在异步任务代码上。这里确实出了点问题。感谢您的帮助 public async Task

在我们当前针对Android的Xamarin项目中,我们在mono rt中看到了大量用于异步任务的SIGSEGV。下面是一个这样的示例代码,它生成了大约20%的SIGSEGV时间。看起来我在做一些根本错误的事情,或者Xamarin在Android上有一些严重的问题。有人能帮我指出生成这个SIGSEGV的代码有什么问题吗

这与什么有关

编辑:我现在在应用程序中看到了这种行为。这是一个有其他错误的。所有崩溃都发生在异步任务代码上。这里确实出了点问题。感谢您的帮助

public async Task GetDataAsync(string downloadUri) {
    using (WebClient downloader = new WebClient ()) {
        downloader.Headers.Add ("x-bz-appId", "android");
        downloader.Headers.Add ("x-bz-authToken", Comman.AuthToken);
        downloader.Headers.Add(HttpRequestHeader.ContentType, "application/json");

        var t = await downloader.DownloadStringTaskAsync(new Uri(downloadUri)).ContinueWith(downloadTask => {
            if (downloadTask.Status == TaskStatus.RanToCompletion) {
                JObject response = null;
                response = JObject.Parse(downloadTask.Result);
                return response;
            } else {
                if (downloadTask.Exception != null) {
                    throw downloadTask.Exception;
                } else {
                    throw new Exception(downloadTask.Status.ToString());
                }
            }
        });
        return t;
    }
}

[mono-rt]堆栈跟踪:
[单色rt]
[mono-rt]at
[mono rt]at(包装器管理为本机)对象。\uuuIcall\uWrapper\uMono\uArray\uNew\uSpecific(intptr,int)
[mono-rt]位于System.Array.Resize(T[]和,int)
[mono rt]at System.Collections.Generic.List`1.set_容量(int)
[mono rt]位于System.Collections.Generic.List`1.GrowIfRequired(int)
[mono-rt]at System.Collections.Generic.List`1.Insert(int,T)
[mono-rt]位于Newtonsoft.Json.Linq.JContainer.InsertItem(int,Newtonsoft.Json.Linq.JToken,bool)
[mono-rt]位于Newtonsoft.Json.Linq.JProperty.InsertItem(int,Newtonsoft.Json.Linq.JToken,bool)
[mono-rt]位于Newtonsoft.Json.Linq.JContainer.AddInternal(int,object,bool)
[mono rt]位于Newtonsoft.Json.Linq.JContainer.Add(对象)
[mono rt]位于Newtonsoft.Json.Linq.JContainer.ReadContentFrom(Newtonsoft.Json.JsonReader)
[mono rt]位于Newtonsoft.Json.Linq.JContainer.ReadTokenFrom(Newtonsoft.Json.JsonReader)
[mono rt]位于Newtonsoft.Json.Linq.JObject.Load(Newtonsoft.Json.JsonReader)
[mono rt]位于Newtonsoft.Json.Linq.JObject.Parse(字符串)
[mono-rt]位于Bloomz.Core.APIClient/c_uuasync0/c_uuanostorey56.m_u0(System.Threading.Tasks.Task`1)[0x0004a]的/Users/hponnu/Projects/Bloomz.native.android.2/Bloomz.Core/HelperClass/APIClient.cs:122
[mono rt]位于System.Threading.Tasks.TaskActionInvoker/FuncTaskInvoke`2.Invoke(System.Threading.Tasks.Task,object,System.Threading.Tasks.Task)
位于System.Threading.Tasks.Task.InnerInvoke()的[mono rt]
位于System.Threading.Tasks.Task.ThreadStart()的[mono rt]
位于System.Threading.Tasks.Task.Execute()的[mono rt]
位于System.Threading.Tasks.TaskScheduler.TryExecuteTask(System.Threading.Tasks.Task)的[mono rt]
位于System.Threading.Tasks.SynchronizationContextScheduler.TaskLaunchWrapper(对象)的[mono rt]
[mono-rt]位于/Users/builder/data/lanes/1131/2a7b6821/source/monodroid/src/mono.Android/src/Android/Android/Android.App/SyncContext.cs:18
[mono-rt]位于/Users/builder/data/lanes/1131/2a7b6821/source/monodroid/src/mono.Android/src/Java.Lang/Thread.cs:36中的Java.Lang.Thread/RunnableImplementor.Run()[0x0000b]
[mono rt]在Java.Lang.irunableinvoker.n_运行(intptr,intptr)[0x00009]in/Users/builder/data/lanes/1131/2a7b6821/source/monodroid/src/mono.Android/platforms/Android-12/src/generated/Java.Lang.irunable.cs:71
[mono rt]at(包装器动态方法)object.18db936a-f8a6-4eb0-838d-1159fbb9846c(intptr,intptr)
[mono rt]at(托管的本机包装器)object.18db936a-f8a6-4eb0-838d-1159fbb9846c(intptr,intptr)
[单色rt]
[单色rt]=================================================================
[mono rt]在执行本机代码时收到SIGSEGV。这通常表明
[mono rt]mono运行时或某个本机库中出现致命错误
应用程序使用的[mono rt]。
[单色rt]=================================================================
[单色rt]

对于初学者,请尝试重构代码,使其正确使用异步语法,然后您可能会看到异常的来源。 看来你想做的是:

public async Task<JToken> GetDataAsync(string downloadUri) {
    using (WebClient downloader = new WebClient ()) {
        downloader.Headers.Add ("x-bz-appId", "android");
        downloader.Headers.Add ("x-bz-authToken", Comman.AuthToken);
        downloader.Headers.Add(HttpRequestHeader.ContentType, "application/json");

        string unParsedResponse = null;
        try{
            unParsedResponse = await downloader.DownloadStringTaskAsync(new Uri(downloadUri));
        }
        cath(Exception ex){
            throw;
        }
        JObject response = null;
        response = JObject.Parse(unParsedResponse);
        return response;
    }
}
公共异步任务GetDataAsync(字符串下载URI){ 使用(WebClient downloader=newWebClient()){ downloader.Headers.Add(“x-bz-appId”、“android”); downloader.Headers.Add(“x-bz-authToken”,Comman.authToken); downloader.Headers.Add(HttpRequestHeader.ContentType,“application/json”); 字符串unParsedResponse=null; 试一试{ unParsedResponse=Wait downloader.DownloadStringTaskAsync(新Uri(downloadUri)); } cath(例外情况除外){ 投掷; } JObject-response=null; response=JObject.Parse(unParsedResponse); 返回响应; } } 另外,你真的不需要try-catch块,因为等待一个任务会截获它的任何异常,因为你除了抛出它之外什么都不做,try-catch在这里是徒劳的


希望能有帮助。

你想在genymotion上运行吗?是的,但我在电话里也看到了同样的问题。在Genymotion上,这种情况发生的频率更高。您是否从
下载任务
(downloadTask.result)返回结果?异常在此之前发生吗?嗯,我以前用print语句打印字符串的长度,它是非零的。是否可以组合一个自包含的测试项目来重现这个问题,以便我可以进一步深入研究它?所以你建议我在ContinueWith上执行“TaskScheduler.FromCurrentSynchronizationContext()”。我试过了,撞车的频率已经降低了,但我还是得到了。顺便说一句,“downloadTask”在您的代码示例中未定义!不,我建议您要么使用异步语法,要么使用
ContinueWith()
手动处理任务,返回任务,检查其状态、异常等。在您的示例中,这两种操作都有点错误,可能是导致异常的原因。
public async Task<JToken> GetDataAsync(string downloadUri) {
    using (WebClient downloader = new WebClient ()) {
        downloader.Headers.Add ("x-bz-appId", "android");
        downloader.Headers.Add ("x-bz-authToken", Comman.AuthToken);
        downloader.Headers.Add(HttpRequestHeader.ContentType, "application/json");

        string unParsedResponse = null;
        try{
            unParsedResponse = await downloader.DownloadStringTaskAsync(new Uri(downloadUri));
        }
        cath(Exception ex){
            throw;
        }
        JObject response = null;
        response = JObject.Parse(unParsedResponse);
        return response;
    }
}