异步操作一般都是涉及多线程,这里使用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里面添加的子元素需要子线程里面返回的结果值 这样运行出来

posted on
浙公网安备 33010602011771号