1

私はHTTPリクエストを行うクロスプラットフォームライブラリで作業しています。 Androidではうまくいきますが、iOSで使用しようとすると例外が発生するため、修正方法を理解できません。C# - Xamarin - HttpClient - オブジェクトの現在の状態のため、操作が無効です - iOS

ここ

が私のコードです:task.Wait();

// method from cross platform library 

Task.Factory.StartNew(delegate 
{ 
    try 
    { 
     var client = new HttpClient(); 
     // some other setup stuff 
     HttpRequestMessage request = new HttpRequestMessage(HttpMethod.post, "http://myurl.com..."); 

     var task = client.SendAsync(request); 
     task.Wait(); // Exception thrown on this line 

     var response = task.Result; 

     var responseString = response.Content.ReadAsStringAsync().Result; 
    } 
    catch (Exception e) 
    { 
    } 
} 

私はいくつかの解決策を見つけようとOperation is invalid due to the current state of the object.

を言うSystem.InvalidOperationExceptionの内部例外でSystem.AggregateExceptionを取得し、私は問題がによって原因であることがわかっUIスレッドでこれを呼び出します。しかし、これはすべてをTask.Factory.StartNewにラップする全体のポイントです。

私が知っているすべてを試してみましたが、まだ問題を解決していません。どんな助けでも大歓迎です。

編集:

私は、iPhoneシミュレータ上で私の解決策を試してみることにしました。 iOS 10を実行しているiPhone 6シミュレータです。私の物理的なデバイスは同じです。それは何かの理由で物理デバイスではなく、シミュレータ上で動作します...非常に奇妙です。

編集2:解決策を見つけるための@YuriSに

感謝。

から:https://forums.xamarin.com/discussion/36713/issue-with-microsoft-http-net-library-operation-is-not-valid-due-to-the-current-state-of-the-objec

何ができるかは、次のとおりです。 1)IOSプロジェクト 2の参考文献に行く)編集 3を参照します)アンドロイドのための 'System.Net.Http'

行動が確認同じ。

+0

実際に別のスレッドプールスレッドで実行される新しいタスクの開始を保証することはできません。なぜあなたはこのようにしていますか? – Cheesebaron

+0

@Cheesebaronどうすればこれが別のスレッドプールスレッドにあることを保証できますか? –

+0

@ JaredPriceなぜこのようにやっているのか混乱しましたが、 "クロスプラットフォームライブラリ"で使用しているAndroidとiOSの両方のプロジェクトに同じNugetパッケージがインストールされていますか? – SushiHangover

答えて

2

ここで説明するいくつかの問題が発生することがあります: https://forums.xamarin.com/discussion/36713/issue-with-microsoft-http-net-library-operation-is-not-valid-due-to-the-current-state-of-the-objec

https://bugzilla.xamarin.com/show_bug.cgi?id=17936

"Operation is not valid" error at Xamarin.iOS project with HttpClient

http://motzcod.es/post/78863496592/portable-class-libraries-httpclient-so-happy

すべてのポストは関係なくSystem.Net.Http

に向いているようです問題は良い方法があるそれらのグラムthis.One:

public static async Task PostRequest() 
{ 
    try 
    { 
     HttpClient client = new HttpClient(); 
     HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "https://myuri"); 
     //request.Headers.Add("", ""); 
     var response = await client.SendAsync(request); 
     var responseString = await response.Content.ReadAsStringAsync(); 
    } 
    catch (Exception ex) 
    { 

    } 
} 

あなたは関数があなただけの呼び出しまたは使用中に「待つ」を省略待ちする必要がない場合は、

await PostRequest(); 

を呼び出し完了まで待つしたい場合

PostRequest.ContinueWith((t)=> 
{ 
}); 

また、関数内で例外を処理する必要があるため、おそらく単にタスクを返すことが最適ではありません。私は元の関数の署名に基づいています。

関連する問題