您的位置:首页 > 大数据 > 人工智能

.net async await

2016-06-27 17:42 267 查看
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;
}
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: