在之前的工作中因为并发和响应的速度并没有怎么使用异步,但是最近的工作开始需要使用一步了。现在根据这几天的使用和在网上的学习进行一下总结。
在我的理解中 Async 和 Await 的使用是为了解决在访问某个方法时,这个方法需要长时间调用,并且这个方法是孤立的(或者在很后面需要返回值进行操作),而产生的解决办法。在这个方法上添加 Async 的装饰,调用这个方法我认为会开辟一个子线程run这个需要长时间调用的方法,并且执行后续的代码。如果需要返回值,就在遇到需要这个返回值之前加上 Await 这样就会等待返回值,直到有返回之后才会进行后续的操作。
public class Threaded : BaseTest
{
public override void Run()
{
Console.WriteLine("start Threaded");
Console.WriteLine("Current Process ID " + Thread.CurrentThread.ManagedThreadId);
TaskAction1();
string test2 = "Test 2";
Task<int> value = TaskAction2(test2);
Console.WriteLine("Test 2 Process ID " + value.Result);
Console.WriteLine("complete Threaded");
}
public async void TaskAction1()
{
await Task.Run(() =>
{
Console.WriteLine("Test 1 Pending...");
Thread.Sleep(5000);
Console.WriteLine("Test 1 Task Process ID " + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("Test 1 Complete");
});
Console.WriteLine("Test 1 Process ID " + Thread.CurrentThread.ManagedThreadId);
}
public async Task<int> TaskAction2(string item)
{
await Task.Run(() => {
Console.WriteLine("Test 2 Pending...");
Thread.Sleep(3000);
Console.WriteLine(item);
Console.WriteLine("Task 2 Complete");
});
return Thread.CurrentThread.ManagedThreadId;
}
}
由此可见主线程是一个线程,Test1 和 Test2 开始运行的时间间隔并不长,而且运行 Test1 的时候是一个线程(9),运行 Test2 的时候是另一个线程,并且因为 Test2 有返回值,在得到 Test2 的返回值后才进行后续的操作,而 Test1 是在执行完所有代码之后才姗姗来迟。所以我理解的 Async 和 Await 的使用是用资源来换取时间。如果是按顺序执行那将先等待 Test1 做完,再等待 Test2 做完,会浪费很多时间,在多并行的应用中可以适当的用资源换取时间。