最近頻繁使用非同步所以自己綜合的學習了一把非同步相關的知識,自己稍加整理了一下(這也是我試著寫的第一篇,如果有不對的,希望大神來指正!) 首先是 委托實現的非同步 class Program { public delegate int weituo();//定義了個委托 public int xxx() ...
首先是 委托實現的非同步
class Program
{
public delegate int weituo();//定義了個委托
public int xxx()
{
Thread.Sleep(3000);
Console.WriteLine("11111.");
return 1;
}
///定義了個方法
static void Main(string[] args)
{
weituo a =new weituo(new Program().xxx);
IAsyncResult result= a.BeginInvoke(null,null);
Console.WriteLine("1234");
Thread.Sleep(1000);
int i= a.EndInvoke(result);
Console.WriteLine("1235");
Console.WriteLine(i.ToString());
Console.ReadLine();
}
}
執行結果如下;
接著是 async /await 的非同步實現
class Program
{
public static async void xxx()
{
int i = 0;
await Task.Run(() =>
{
new Program().xxxa();
});
Console.WriteLine("123");
}
public async Task<int> xxxa()
{
Thread.Sleep(3000);
Console.WriteLine("11111.");
return (2);
}
static void Main(string[] args)
{
xxx();
Console.WriteLine("1234");
Console.WriteLine("1235");
Console.ReadLine();
}
}
執行結果
如果將
public static async void xxx()
{
int i = 0;
await Task.Run(() =>
{
new Program().xxxa();
});
Console.WriteLine("123");
}
改為
public static async void xxx()
{
int i = 0;
await new Program().xxxa();
Console.WriteLine("123");
}
結果變為
說明,async與await關鍵字本身並不會產生多線程;
await 不會開啟新的線程,當前線程會一直往下走直到遇到真正的Async方法(比如說HttpClient.GetStringAsync),這個方法的內部會用Task.Run或者Task.Factory.StartNew 去開啟線程。也就是如果方法不是.NET為我們提供的Async方法,我們需要自己創建Task,才會真正的去創建線程