async 和 await 例子

/// <summary>

/// C# 5.0

/// .net framework4.5

/// CLR4.0

/// 引入了async 和 await。这两个关键字可以让你更方便的写出异步代码。以前是委托 BeginInvoke ()

/// async/await是依附于Task的异步,

/// 只有async方法认为是同步的,只是返回结果类型是

/// await一定存在于async方法里面 只有async没有await的话是同步方法

/// 返回的结果是Task<T>,其中T为最终结果

/// await关键字只能放在Task前面

---------------------------------------------------------------

/// <summary>

/// 只有async没有await,会有个warn

/// 跟普通方法没有区别

/// </summary>

private static async void NoReturnNoAwait()

{

//主线程执行

Console.WriteLine("NoReturnNoAwait Sleep before Task,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

Task task = Task.Run(() =>//启动新线程完成任务

{

Console.WriteLine("NoReturnNoAwait Sleep before,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

Thread.Sleep(3000);

Console.WriteLine("NoReturnNoAwait Sleep after,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

});

//主线程执行

Console.WriteLine("NoReturnNoAwait Sleep after Task,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

}

-------------------------------------------------------------------------------------------

/// <summary>

/// async/await

/// await 要放在task前面

/// 不推荐void返回值,使用Task来代替

/// Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用。Async Void 不行

/// </summary>

private static async void NoReturn()

{

//主线程执行

Console.WriteLine("NoReturn Sleep before await,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

TaskFactory taskFactory = new TaskFactory();

Task task = taskFactory.StartNew(() =>

{

Console.WriteLine("NoReturn Sleep before,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

Thread.Sleep(3000);

Console.WriteLine("NoReturn Sleep after,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

});

await task;

//子线程执行 其实是封装成委托,在task之后成为回调(编译器功能 状态机实现)

Console.WriteLine("NoReturn Sleep after await,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);//这个不由主线程执行

}

/// <summary>

/// 无返回值 async Task == async void

/// Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用。Async Void 不行

/// </summary>

/// <returns></returns>

private static async Task NoReturnTask()

{

//这里还是主线程的id

Console.WriteLine("NoReturnTask Sleep before await,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

Task task = Task.Run(() =>

{

Console.WriteLine("NoReturnTask Sleep before,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

Thread.Sleep(3000);

Console.WriteLine("NoReturnTask Sleep after,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

});

await task;

Console.WriteLine("NoReturnTask Sleep after await,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

//return new TaskFactory().StartNew(() => { }); 不能return

}

/// <summary>

/// 带返回值的Task

/// 要使用返回值就一定要等子线程计算完毕

/// </summary>

/// <returns>async 就只返回long</returns>

private static async Task<long> SumAsync()

{

Console.WriteLine("SumAsync {1} start ManagedThreadId={0}", Thread.CurrentThread.ManagedThreadId, 111);

long result = 0;

await Task.Run(() =>

{

for (int k = 0; k < 10; k++)

{

Console.WriteLine("SumAsync {1} await Task.Run ManagedThreadId={0}", Thread.CurrentThread.ManagedThreadId, k);

System.Threading.Thread.Sleep(1000);

}

for (long i = 0; i < 999999999; i++)

{

result += i;

}

});

Console.WriteLine("SumAsync {1} end ManagedThreadId={0}", Thread.CurrentThread.ManagedThreadId, 111);

return result;

}

原文地址:https://www.cnblogs.com/anyihen/p/12773269.html