using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace AsyncAndAwait_Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("主线程ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
AsyncTest();
Console.WriteLine("主线程ManagedThreadId2:" + Thread.CurrentThread.ManagedThreadId);
Console.ReadKey();
}
static async void AsyncTest()
{
Console.WriteLine("*******Start************ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
Task<int> taskA = Print();
Console.WriteLine("*********Middle**********ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
int a = await taskA;
Console.WriteLine("*********End**********ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
}
static Task<int> Print()
{
var tcs = new TaskCompletionSource<int>();
var thrd = new Thread(() =>
{
Console.WriteLine("子线程ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
for (int i = 0; i < 3; i++)
{
Console.WriteLine("===========等待==========" + i);
System.Threading.Thread.Sleep(1000);
}
tcs.SetResult(99);
});
thrd.Start();
return tcs.Task;
}
}
}
}
await 应该是 先检查 task 的结果 如果已经有返回值 则不切换环境(线程) 如果没有则要另开线程去等待。切换线程
测试方法 可以修改 tcs1.SetResult(100); 前的延时观察 线程ID 的变化
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace AsyncAndAwait_Test
{
class Program
{
/// <summary>
/// async 和await 实践测试
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
var tcs1 = new TaskCompletionSource<int>();
var tcs2 = new TaskCompletionSource<int>();
Console.WriteLine("主线程ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
AsyncTest(tcs1, tcs2);
Console.WriteLine("主线程2ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5000);
tcs1.SetResult(100);
// tcs1.SetCanceled();
Thread.Sleep(5000);
tcs2.SetResult(100);
Console.WriteLine("主线程结束ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
Console.ReadKey();
}
static async void AsyncTest(TaskCompletionSource<int> tcs1, TaskCompletionSource<int> tcs2)
{
try
{
Console.WriteLine("AsyncTest方法执行的线程id:" + Thread.CurrentThread.ManagedThreadId);
//await后线程出现变化,异步执行(线程id不一样)
int a = await Print();
Console.WriteLine("Print 1****await tcs3后的线程id:" + Thread.CurrentThread.ManagedThreadId);
// await 应该是 先检查 task 的结果 如果已经有返回值 则不切换环境(线程) 如果没有则要另开线程去等待。切换线程
//测试方法 可以修改 tcs1.SetResult(100); 前的延时观察 线程ID 的变化
int b = await tcs1.Task;
Console.WriteLine("11****await tcs1后的线程id:" + Thread.CurrentThread.ManagedThreadId);
int c = await Print();
Console.WriteLine("Print 2****await tcs1后的线程id:" + Thread.CurrentThread.ManagedThreadId);
await dodeleytime();
int d = await tcs2.Task;
Console.WriteLine("22****await tcs2后的线程id:" + Thread.CurrentThread.ManagedThreadId);
}
catch(Exception e)
{
Console.WriteLine("yyss****await 后的线程id:" + Thread.CurrentThread.ManagedThreadId+" "+e.Message);
}
}
public static async Task dodeleytime()
{
Console.WriteLine("dodeleytime前的线程id:" + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(20);
Console.WriteLine("dodeleytime后的线程id:" + Thread.CurrentThread.ManagedThreadId);
}
static Task<int> Print()
{
var tcs3 = new TaskCompletionSource<int>();
var thrd = new Thread(() =>
{
Console.WriteLine("子线程ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
for (int i = 0; i < 3; i++)
{
Console.WriteLine("===========等待==========" + i);
System.Threading.Thread.Sleep(1000);
}
tcs3.SetResult(99);
});
thrd.Start();
return tcs3.Task;
}
}
}