天天看点

异步多线程执行顺序

作者:威乐Go购

static async Task Main(string[] args)

{

TestMethod();
Console.WriteLine("main" + Thread.CurrentThread.ManagedThreadId);
Console.Read();           

}

static async Task TestMethod()

{

Console.WriteLine("TestMethod beging" + Thread.CurrentThread.ManagedThreadId);
d1();
Console.WriteLine("TestMethod running" + Thread.CurrentThread.ManagedThreadId);
await d2();           

}

static async Task d1()

{

Task.Run(()=> {
Console.WriteLine("d1 beging" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.WriteLine("d1 end" + Thread.CurrentThread.ManagedThreadId);           

});

static async Task<int> d2()

{

Task.Run(()=> {
Console.WriteLine("d2 beging" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.WriteLine("d2 end" + Thread.CurrentThread.ManagedThreadId);

});
return 2;           

}

执行顺序:

异步多线程执行顺序

TestMethod方法里面调用d1方法,d1另外开启一个线程运行,程序执行到d1里面的run会在线程池中申请线程执行,这里直接调用线程执行返回继续执行。这里先执行d1 beging还是先执行main 不确定。

static async Task Main(string[] args)
{

TestMethod();
Console.WriteLine("main" + Thread.CurrentThread.ManagedThreadId);
Console.Read();
}

static async Task TestMethod()
{
Console.WriteLine("TestMethod beging" + Thread.CurrentThread.ManagedThreadId);
await d1();
Console.WriteLine("TestMethod running" + Thread.CurrentThread.ManagedThreadId);
await d2();
}

static async Task d1()
{
//Thread.Sleep(1);
Console.WriteLine("d1 beging" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
   Console.WriteLine("d1 end" + Thread.CurrentThread.ManagedThreadId);
}

static async Task<int> d2()
{
Console.WriteLine("d2 beging" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.WriteLine("d2 end" + Thread.CurrentThread.ManagedThreadId);
return 2;
}
           

TestMethod 调用 await d1,await d2 异步调用时候,d1,d2两个方法都没有加Task.run另外开启线程运行,则还是在同一个线程中执行,执行的线程都是调用线程1。await d1,await d2异步等待Task任务完成后再继续执行后面的代码。

异步多线程执行顺序
static async Task Main(string[] args)
{

TestMethod();
Console.WriteLine("main" + Thread.CurrentThread.ManagedThreadId);
Console.Read();
}

static async Task TestMethod()
{
Console.WriteLine("TestMethod beging" + Thread.CurrentThread.ManagedThreadId);
await d1();
Console.WriteLine("TestMethod running" + Thread.CurrentThread.ManagedThreadId);
await d2();
}

static async Task d1()
{
await Task.Run(() =>
{
//Thread.Sleep(1);
Console.WriteLine("d1 beging" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.WriteLine("d1 end" + Thread.CurrentThread.ManagedThreadId);
});
}

static async Task<int> d2()
{
await Task.Run(() =>
{
Console.WriteLine("d2 beging" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.WriteLine("d2 end" + Thread.CurrentThread.ManagedThreadId);
});
return 2;
}           
异步多线程执行顺序

继续阅读