using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
namespace CookBook
{
class Program
{
static void Main(string[] args)
{
//Class1 class1 = new Class1();
//Console.WriteLine("主线程开始");
//class1.DoSomethingAsync();
//Console.WriteLine("主线程结束");
//Class2 class2 = new Class2();
//Console.WriteLine("主线程开始");
//class2.DoSomethingAsync();
//Console.WriteLine("主线程结束");
//string info = Class3.GetUrlStr("http://www.baidu.com");
//Console.WriteLine(info);
Console.WriteLine("1主线程开始:{0}", Thread.CurrentThread.ManagedThreadId);
Program p = new Program();
string url = "http://www.baidu.com";
int timeout = 1;
p.DoSomethingAsync(url, timeout);
p.DoSomething();
Console.WriteLine("6主线程结束:{0}", Thread.CurrentThread.ManagedThreadId);
Console.ReadKey();
}
public async Task DoSomethingAsync(string url, int timeout)
{
Console.WriteLine("2子线程开始:{0}", Thread.CurrentThread.ManagedThreadId);
try
{
var result = await DownloadStringWithRetries(url, timeout);
Console.WriteLine("{0}", result);
}
catch (Exception ex)
{
Console.WriteLine("7错误:{1},{0}", Thread.CurrentThread.ManagedThreadId, ex.Message);
}
Console.WriteLine("4子线程结束:{0}", Thread.CurrentThread.ManagedThreadId);
}
private void DoSomething()
{
Console.WriteLine("3主线程开始:{0}", Thread.CurrentThread.ManagedThreadId);
for (int j = 0; j != 1000; j++)
{
int result = 0;
for (int i = 0; i != 10000000; i++)
{
result *= i;
}
}
Console.WriteLine("5主线程开始:{0}", Thread.CurrentThread.ManagedThreadId);
}
/// <summary>
/// 获取url源码,报错重试
/// </summary>
/// <param name="url"></param>
/// <param name="timeout"></param>
/// <returns></returns>
private async Task<string> DownloadStringWithRetries(string url, int timeout)
{
var nextDelay = TimeSpan.FromSeconds(1);
for (int i = 0; i != 3; ++i)
{
try
{
return await DownloadStringWithTimeout(url, timeout);
}
catch
{
}
await Task.Delay(nextDelay);
nextDelay = nextDelay + nextDelay;
}
return await DownloadStringWithTimeout(url, timeout);
}
/// <summary>
/// 获取url源码,超时直接报错
/// </summary>
/// <param name="url"></param>
/// <param name="timeout"></param>
/// <returns></returns>
private async Task<string> DownloadStringWithTimeout(string url, int timeout)
{
using (var client = new HttpClient())
{
var downloadTask = client.GetStringAsync(url);
var timeoutTask = Task.Delay(timeout);
var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
if (completedTask == timeoutTask)
{
throw new Exception("处理超时");
}
return await downloadTask;
}
}
}
}