using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
// c#-异步编程基础-调用异步方法
namespace yibBianchengJichu
{
class Program
{
void traceThreadAndTask(string info)
{
string taskInfo = Task.CurrentId == null ? "no task" : "task" + Task.CurrentId;
Console.WriteLine($"{info} in thread {Thread.CurrentThread.ManagedThreadId} " + $"and {taskInfo}");
}
string Greeting(string name)
{
traceThreadAndTask($"running {nameof(Greeting)}");
Task.Delay(3000).Wait();
return $"hello,{name}";
}
Task<string> GreetingAsync(string name) => Task.Run<string>(() => {
traceThreadAndTask($"running {nameof(GreetingAsync)}");
return Greeting(name);
});
async void CallWhithAsync()
{
traceThreadAndTask($"started{nameof(CallWhithAsync)}");
string result = await GreetingAsync("stephanie");
Console.WriteLine(result);
traceThreadAndTask($"ended {nameof(CallWhithAsync)}");
}
async void CallWhithSsync2()
{
traceThreadAndTask($"started{nameof(CallWhithSsync2)}");
Console.WriteLine(await GreetingAsync("stephanie2"));
traceThreadAndTask($"ended {nameof(CallWhithSsync2)}");
}
// 使用Awaiter
void CallerWithAwaiter()
{
traceThreadAndTask($"started{nameof(CallerWithAwaiter)}");
TaskAwaiter<string> awaiter = GreetingAsync("Matthias").GetAwaiter();
awaiter.OnCompleted(OnCompleteAwaiter);
void OnCompleteAwaiter()
{
Console.WriteLine(awaiter.GetResult());
traceThreadAndTask($"started{nameof(CallerWithAwaiter)}");
}
}
// 延续任务
void CallerWithContinuationTask()
{
traceThreadAndTask($"started{nameof(CallerWithContinuationTask)}");
var t1 = GreetingAsync("stephanie");
t1.ContinueWith(t =>
{
string result = t.Result;
Console.WriteLine(result);
traceThreadAndTask($"ended {nameof(CallerWithContinuationTask)}");
});
}
// 创建任务-调用异步方法-使用Awaiter-延续任务
void main()
{
//traceThreadAndTask("test");
//同步任务
//Greeting("test");
CallWhithAsync();
//CallWhithSsync2();
//CallerWithAwaiter();
//CallerWithContinuationTask();
Thread.Sleep(8000);
}
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Program p = new Program();
p.main();
}
}
}
代码分析
函数名称 | 线程id | 任务id |
CallWhithAsync-开始 | 0 | 无 |
GreetingAsync | 4 | 1 |
Greeting | 4 | 1 |
CallWhithAsync-结束 | 4 | 无 |
CallWhithAsync 异步调用后线程编程了4,且4是异步任务的线程。
在异步调用时候,创建了任务,并且任务id是1.
执行完任务后,线程不规划,仍然在创建任务的线程中运行,但是任务却没有了。(线程和任务的差别是什么呢?)