以下のプログラムの開始後に、何らかの理由で一時停止があります。WebClient().DownloadStringTaskAsync()
それが原因だと思います。
class Program
{
static void Main(string[] args)
{
AsyncReturnTask();
for (int i = 0; i < 15; i++)
{
Console.WriteLine(i);
Thread.Sleep(100);
}
}
public static async void AsyncReturnTask()
{
var result = await DownloadAndReturnTaskStringAsync();
Console.WriteLine(result);
}
private static async Task<string> DownloadAndReturnTaskStringAsync()
{
return await new WebClient().DownloadStringTaskAsync(new Uri("http://www.weather.gov"));
}
}
私が理解している限り、私のプログラムはすぐに 0 から 15 までのカウントを開始する必要があります。私は何か間違ったことをしていますか?
元の Netflix ダウンロード サンプル ( CTPで取得) でも同じ問題がありました。検索ボタンを押した後、UI が最初にフリーズし、しばらくすると、次の映画の読み込み中に応答します。そして、PDC 2010 での Anders Hejlsberg のプレゼンテーションでは、それは固まらなかったと思います。
もう一つ。代わりに
return await new WebClient().DownloadStringTaskAsync(new Uri("http://www.weather.gov"));
私は自分の方法を使用します:
return await ReturnOrdinaryTask();
それは次のとおりです。
public static Task<string> ReturnOrdinaryTask()
{
var t = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("------------- " + i.ToString());
Thread.Sleep(100);
}
return "some text";
});
return t;
}
正常に動作します。つまり、何もロードされませんが、すぐに開始され、作業中にメインスレッドをブロックしません。
編集
OK、私が今信じているのは、WebClient.DownloadStringTaskAsync
機能が台無しになっているということです。次のように、最初のブロック期間なしで機能するはずです。
static void Main(string[] args)
{
WebClient cli = new WebClient();
Task.Factory.StartNew(() =>
{
cli.DownloadStringCompleted += (sender, e) => Console.WriteLine(e.Result);
cli.DownloadStringAsync(new Uri("http://www.weather.gov"));
});
for (int i = 0; i < 100; i++)
{
Console.WriteLine(i);
Thread.Sleep(100);
}
}