2

HTTP リクエストを行うクロスプラットフォーム ライブラリに取り組んでいます。Android では問題なく動作していますが、iOS で使用しようとすると例外が発生し、修正方法がわかりません。

これが私のコードです:

// 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)
    {
    }
}

task.Wait();System.AggregateExceptionは内部例外を取得System.InvalidOperationExceptionしますOperation is invalid due to the current state of the object.

いくつかの解決策を見つけようとしたところ、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-オブジェクト

あなたができることは次のとおりです:1)iosプロジェクトの参照に移動します2)参照を編集します3)「System.Net.Http」を確認します

Android の動作は同じです。

4

1 に答える 1

2

ここで説明されているいくつかの問題がある可能性があります: https://forums.xamarin.com/discussion/36713/issue-with-microsoft-http-net-library-operation-is-not-valid-due-to-the-current-オブジェクトの状態

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

HttpClient を使用した Xamarin.iOS プロジェクトでの "操作が無効です" エラー

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

System.Net.Http を指しているすべての投稿のようです

問題に関係なく、これを行うより良い方法があります。そのうちの1つ:

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();

待つ必要がない場合は、呼び出しで「await」を省略するか、

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

また、関数内で例外を処理する必要があるため、おそらく Task だけを返すのは最適ではありません。元の関数シグネチャに基づいて答えただけです

于 2016-10-25T17:37:55.717 に答える