2

d2 への非同期呼び出しを行う QueryJourneys を呼び出しますが、WebClient を使用して一部のコンテンツ (XML) を非同期でダウンロードしようとすると失敗します。

唯一のメッセージとして文字列"Task_Start_NullAction"を含む例外InvalidOperationExceptionを取得します。

なにが問題ですか?

呼び出しコード:

    autoCompleteBox.ItemsSource = await OpenAPI.QueryStation(e.Parameter);

例外をスローする背後にあるコード:

    public static Task<IEnumerable<Journey>> QueryJourneys(
                                                 Point from, 
                                                 Point to, 
                                                 DateTime lastStart)
    {
        string str = cs_requestResultPage(from, to, lastStart);

        Task<IEnumerable<Journey>> t = d2(str);
        t.Start();
        return t;
    }

    private static async Task<IEnumerable<Journey>> d2(string str)
    {
        var webClient = new WebClient();
        webClient.Encoding = Encoding.UTF8;

        string t = await webClient.DownloadStringTaskAsync(new Uri(str));
        var view = new ResultPageView(XDocument.Parse(t));

        return view.Journeys;
4

1 に答える 1

4

問題は への呼び出しTask.Start()です。非同期メソッドによって返されたタスクを明示的に開始することはできません。メソッドが返された時点で、タスクはすでに実質的に進行中です。QueryJourneysメソッドから直接返すことができます:

public static Task<IEnumerable<Journey>> QueryJourneys(Point from, Point to,
                                                       DateTime lastStart)
{
    string str = cs_requestResultPage(from, to, lastStart);
    return d2(str);
}

余談ですが、.NET 命名規則に従って、より意味のある名前をメソッドに付けることを強くお勧めします。

(別の話として、どのメソッドが例外をスローしたかは常に言う価値があります。この場合は、おそらくTask.Start.)

于 2012-01-08T17:32:06.210 に答える