1

明らかな間違いがあるかもしれませんが、私は経験のないことをしています。インターネットから文字列を取得しようとしていますが、うまくいきません。WinRT では、非同期メソッドで HttpClient を使用する必要があります。これは次のように行いました。

    private async void update()
    {
        try
        {   
                rawdata = await client.GetStringAsync(url);     

        }
        catch
        {
            rawdata = "Updation failed. Error code:vish42042";
        }

      }

さて、コードの呼び出し方法は次のとおりです。

    string temp = @url;
                update();
          WAIT:
                if (rawdata == null) {
                    goto WAIT;
                }

rawdata はグローバル変数です。goto WAIT でこのチェックを行いました。コードが失敗した正確な場所と、ここで失敗したことを確認します。生データがインターネットから更新されたときにifループが壊れることを期待していますが、決して起こりません。私は間違った方法でやっていますか?(明らかに、私が知っている最善の方法でやっているわけではありませんが、それも間違っていますか?)。問題はどこだ?

更新: 実際の問題は、この機能を機能させる方法ではなく、1 つまたは 2 つの変更を加えて機能することです。本当の問題は、 update() 関数が呼び出されたときに rawdata が更新されるようにするにはどうすればよいかということです。

いくつかの非常に良い説明と回答の後、これが問題を解決できるポイントだと思います:-

     string xmlstring = xmlupobj.getUpdatedData(); 
     // Above is the ultimate point of return of data. 
    //Next code line is this, which throws a null exception 
                    XDocument xmldoc = XDocument.Parse(xmlstring);

したがって、getUpdatedData() を非同期にして Task を返した後、ダウンロードされている場合は Task を適切な文字列に変換でき、ダウンロードされていない場合は null に変換できれば、いくつかの悪いコード行を次のように使用して確認できます。

    string xmlstring = xmlupobj.getUpdatedData();
    WAIT:
        if (xmlstring == null)
        {
            goto WAIT;
        }
        xmldoc = XDocument.Parse(xmlstring);

それが正しければ、唯一の問題は xmlstring を設定する方法ですか?

4

2 に答える 2

3

このメソッドが次を返すようにする必要がありますTask

private async Task update()
{
    try
    {
        using (var client = new HttpClient())
        {
            rawdata = await client.GetStringAsync(url);     
        }
    }
    catch
    {
        rawdata = "Updation failed. Error code:vish42042";
    }
}  

次に、それを呼び出すと:

string temp = @url;
await update();

// rawdata will be set here

別のオプションは、変数に設定する代わりに、文字列を直接返すことです。

private async Task<string> UpdateAsync()
{
    try
    {
        using (var client = new HttpClient())
        {
            return await client.GetStringAsync(url);     
        }
    }
    catch
    {
        return "Updation failed. Error code:vish42042";
    }
}  

次に、次の方法でデータを取得できます。

string rawdata = await UpdateAsync();

これらのメソッドは両方とも、呼び出し元もメソッドである必要があることに注意してくださいasync

于 2013-04-17T18:11:31.303 に答える
2

あなたの更新に基づいて:

実際問題は、この関数を機能させる方法ではなく、1 つまたは 2 つの変更を加えて機能することです。本当の問題は、 update() 関数が呼び出されたときに rawdata が更新されるようにするにはどうすればよいかということです。

答えは簡単です。 できません

メソッドを非同期にする全体的な目的は、呼び出しupdateがすぐに値を設定するのではなく、将来の未知の時点で値を設定する作業単位を開始し、待機する代わりにプログラムを続行できるようにすることです。 . 戻り値の前に変数が確実に設定されるupdateようにするには、非同期を使用する代わりに、メソッドを同期にし、値が存在するのをメソッド内で待機する必要があります。

非同期を維持したい場合は、結果が計算されたときに呼び出し元に通知できるようにするために、 Reed's answerupdateに示されているように、いくつかの簡単な変更を加える必要があります。その後、メソッドを使用するか、手動でを使用して継続し、結果が計算されたら目的のコードを実行します。awaitContinueWith

于 2013-04-17T18:50:51.307 に答える