异步操作一般都是涉及多线程,这里使用Task来启动线程,好处就是他的线程不是new出来的 是从线程池里面去获取一个
class Program { static void Main(string[] args) { Test t = new Test(); Task.Run(() => { t.t3(); }); Console.Read(); } } public class Test { IList<string> list { get; set; } public Test() { if (list == null) { list = new List<string>(); } } public async Task<string> T1() { Console.WriteLine("--t1--s"); System.Threading.Thread.Sleep(1000); return await Task.Run<string>(() => { Console.WriteLine("--t1--e"); return "test"; }); } public async Task<string> T2() { Console.WriteLine("t2"); var t = await T1(); return t; } public async void t3() { for (int i = 0; i < 5; i++) { Console.WriteLine("---t3---s"); Task.Run(() => { T2(); }); if (list != null && list.Count > 0) { Console.WriteLine(list[i]); } Console.WriteLine("---t3---e"); } } }
预期结果是
这里看到主线程并不等待结果子线程的结果
如果想等待的话 就必须要让其使用子线程的返回值
public async void t3() { for (int i = 0; i < 5; i++) { Console.WriteLine("---t3---s"); list.Add(await Task.Run<string>(() => { return T2(); })); if (list != null && list.Count > 0) { Console.WriteLine(list[i]); } Console.WriteLine("---t3---e"); } }
用这个替换 list.Add里面添加的子元素需要子线程里面返回的结果值 这样运行出来