由于某种原因,下面的程序启动后会出现暂停。我相信这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获得)遇到了同样的问题 - 在按下搜索按钮后,用户界面首先冻结 - 一段时间后,它在加载下一部电影时有响应。我相信它并没有在 Anders Hejlsberg 在 PDC 2010 上的演讲中被冻结。
还有一件事。什么时候代替
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;
}
它可以正常工作。我的意思是它不会加载任何东西,但它会立即启动并且不会阻塞主线程,同时执行它的工作。
编辑
好的,我现在相信的是: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);
}
}