2017-04-25 83 views
0

我試圖使用Mono下的HttpClient(在.NET Framework下運行正常),但我得到錯誤;Mono下的HttpClient拋出一個錯誤

04-25 14:07:14.952 I/Choreographer(3238): Skipped 144 frames! The application may be doing too much work on its main thread. 
[0:] An error occurred while sending the request 
[0:] at System.Net.Http.HttpClientHandler+<SendAsync>c__async0.MoveNext() [0x0047a] in /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs:383 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 
    at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 
    at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult() [0x00000] in /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:535 
    at System.Net.Http.HttpClient+<SendAsyncWorker>c__async0.MoveNext() [0x000a9] in /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClient.cs:276 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 
    at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 
    at System.Runtime.CompilerServices.TaskAwaiter`1[TResult].GetResult() [0x00000] in /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357 
    at MyWebClient+<MakeRequest>d__63.MoveNext() [0x0019b] in <4eeea402c92c428f818fd28bf1ed35bc>:0 

我的代碼;

var httpClient = new HttpClient { Timeout = new TimeSpan(0, 0, (int) TimeOut) }; 
foreach (var header in Headers) 
{ 
    httpClient.DefaultRequestHeaders.Add(header.Key, header.Value); 
} 

// attempting to workaround Xamarin bug 
// http://forums.xamarin.com/discussion/17770/length-required-error-in-http-post-since-latest-release 
var requestcontent = new HttpRequestMessage(HttpMethod.Post, Url) 
{ 
    Content = !string.IsNullOrEmpty(RequestStr) 
     ? new StringContent(RequestStr, Encoding.UTF8, "application/json") 
     : new ByteArrayContent(new byte[0]) 
}; 

using (HttpResponseMessage response = await httpClient.SendAsync(requestcontent)) 
{ 
    using (HttpContent content = response.Content) 
    { 
     ResponseStr = await content.ReadAsStringAsync(); 
    } 
} 

我試圖解決這個問題(這裏HttpClientHandler.cs:383詳述)的代碼,但它仍然拋出的錯誤,但在NET標準& NET46完美的作品。

這裏是Xamarin軟件包的版本;

Xamarin.Android.Support.Animated.Vector.Drawable.23.3.0 
Xamarin.Android.Support.Design.23.3.0 
Xamarin.Android.Support.v4.23.3.0 
Xamarin.Android.Support.v7.AppCompat.23.3.0 
Xamarin.Android.Support.v7.CardView.23.3.0 
Xamarin.Android.Support.v7.MediaRouter.23.3.0 
Xamarin.Android.Support.v7.RecyclerView.23.3.0 
Xamarin.Android.Support.Vector.Drawable.23.3.0 
Xamarin.Forms.2.3.4.231 
+1

您使用的是哪種版本的單聲道? – knocte

+0

我已經更新了我的問題,以及我所知道的。 – wonea

+0

請在http://bugzilla.xamarin.com上報告你的bug – knocte

回答

0

應用程序可以做它的主線程的工作太多了。

當您嘗試在主UI線程上執行HTTP請求時,通常會發生這種情況。

+0

我們可以做些什麼來避免它? –

+0

@Phoenix你需要對長時間運行的東西使用異步執行。示例:var data = await httpClient.GetAsync(「http://google.com」); – Andrei