0

というクラスがWebUtilあり、その中には という抽象関数がありGetWebpage()ます。この関数の 1 つの実装ではWebClientクラスを使用し、別の実装ではHttpClientawait/async 機能を備えた new を使用します。問題は、HttpClientrequires the method to returnの使用ですTask<>。そのため、抽象メソッドの定義を変更しました。しかし今、 を使用する関数はWebClientも返さなければなりませんTask<>

これを処理する良い方法はありますか?私がよく知らないことはありますか?

4

3 に答える 3

3

Task<>で戻ることWebClientができますTask.FromResult

Task<string> GetWebPage(string url)
{
    var c = new WebClient();
    var html = c.DownloadString(url);
    return Task.FromResult(html);
}

TaskCompleteSource<T>または、 convert events to taskを使用できます。

Task<string> GetWebPage(string url)
{
    var c = new WebClient();
    var tcs = new TaskCompleteSource<string>();
    c.DownloadStringCompleted += (o, e) => tcs.SetResult((string)e.Result);
    c.DownloadStringAsync(new Uri(url));
    return tcs.Task;
}
于 2013-06-01T11:12:25.457 に答える
0

Stephen Cleary がコメントで述べたように、WebClientサポートも行うため、いずれかのメソッドasyncを呼び出すことができます。-TaskAsync

ただし、一般的には、 (メソッドが高速な場合) または(メソッドが低速な場合) のasyncいずれかを使用してインターフェイスを実装しても問題ありません。Task.FromResult()Task.Run()

于 2013-06-01T13:27:57.733 に答える