3

非同期CTPには、署名付きの拡張メソッドがあります

WebClient.DownloadStringTaskAsync(Uri,CancellationToken) 

これはVS11のどこにありますか?
このメソッドを取得するには、非同期CTPをインストールする必要がありますか?

4

4 に答える 4

3

.NET 4.5では、おそらく新しいHttpClientクラス、特にGetStringAsyncメソッドを使用します。

于 2012-03-17T00:38:13.860 に答える
2

CancellationTokenサポートが組み込まれていないのは残念ですが、RegisterメソッドとCancelAsyncメソッドを利用して概算する方法は次のとおりです。

var downloadTask = webClient.DownloadStringTaskAsync(source);

string text;
using (cancellationToken.Register(() => webClient.CancelAsync()))
{
    text = await downloadTask;
}
于 2016-06-24T16:11:58.487 に答える
1

.Net 4.5ベータ版にはまだ存在します。拡張メソッドではなくなったことを除いて、MSDNを参照してください。

WebClient参照しているのは、.NetforMetroスタイルアプリには含まれていないという事実です。そこでは、おそらくを使用する必要がありますHttpClient。もう1つのオプションは、を使用することHttpWebRequestです。これはまだ存在しており、Taskベースの非同期メソッドでも拡張されています。

于 2012-03-17T02:54:25.353 に答える
0

System.Net.WebClientクラスとSystem.Net.Http.HttpClientクラスの両方に非同期関数があります。これにより、非同期関数を作成できます。GetStringAsync関数が非同期で実行されている間、キャンセルが要求されているかどうかを定期的に確認できます。

例:System.Net.Httpを使用する; class HttpSonnetFetcher {const string sonnetsShakespeare = @ " http://www.gutenberg.org/cache/epub/1041/pg1041.txt ";

    public async Task<IEnumerable<string>> Fetch(CancellationToken token)
    {
        string bookShakespeareSonnets = null;
        using (var downloader = new HttpClient())
        {
            var downloadTask = downloader.GetStringAsync(sonnetsShakespeare);
            // wait until downloadTask finished, but regularly check if cancellation requested:
            while (!downloadTask.Wait(TimeSpan.FromSeconds(0.2)))
            {
                token.ThrowIfCancellationRequested();
            }
            // if still here: downloadTask completed
            bookShakespeareSonnets = downloadTask.Result;
        }

        // just for fun: find a nice sonnet, remove the beginning, split into lines and return 12 lines
        var indexNiceSonnet = bookShakespeareSonnets.IndexOf("Shall I compare thee to a summer's day?");
        return bookShakespeareSonnets.Remove(0, indexNiceSonnet)
            .Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)
            .Take(12);  
    }
}

使用法は次のようになります。

private void TestCancellationHttpClient()
{
    try
    {
        var sonnetFetcher = new HttpSonnetFetcher();
        var cancellationTokenSource = new CancellationTokenSource();

        var sonnetTask = Task.Run(() => sonnetFetcher.Fetch(cancellationTokenSource.Token));
        cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(10));

        // meanwhile do something else, checking regularly if the task finished, or if you have nothing to do, just Task.Wait():
        while (!sonnetTask.Wait(TimeSpan.FromSeconds(0.25)))
        {
            Console.Write('.');
        }
        // if still here: the sonnet is fetched. return value is in sonnetTask.Result
        Console.WriteLine("A nice sonnet by William Shakespeare:");
        foreach (var line in sonnetTask.Result)
        {
            Console.WriteLine(line);
        }
    }

    catch (OperationCanceledException exc)
    {
        Console.WriteLine("Canceled " + exc.Message);
    }
    catch (AggregateException exc)
    {
        Console.WriteLine("Task reports exceptions");
        var x = exc.Flatten();
        foreach (var innerException in x.InnerExceptions)
        {
            Console.WriteLine(innerException.Message);
        }
    }
    catch (Exception exc)
    {
        Console.WriteLine("Exception: " + exc.Message);
    }
}

単純なコンソールプログラムでこれを試して、ソネットが適切にフェッチされていることを確認し、CancelAfterを10秒からたとえば0.1秒まで減らし、タスクが適切にキャンセルされていることを確認します。

注意:OperationCancelledExceptionがスローされますが、この例外はAggregateExceptionの内部例外としてラップされます。タスク内で発生するすべての例外は、常にAggregateExceptionにラップされます。

于 2015-07-10T08:15:19.023 に答える