我知道TPL是面向任务的,而传统的线程模型是面向工作者的。 任务让你主要关注你想要解决什么问题,而不是如何使用 来完成。但是当涉及到线程和任务关系时,我仍然有点困惑。如何确定使用TPL时将执行哪个线程?
下面是一个演示代码:
namespace AsyncUnderTheHood
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main Start : {0}", Thread.CurrentThread.ManagedThreadId);
AwaitTest();
Console.WriteLine("Main End : {0}", Thread.CurrentThread.ManagedThreadId);
Console.ReadLine();
}
public static void DoWork()
{
Console.WriteLine("DoWork Start: {0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5000);
Console.WriteLine("DoWork End: {0}", Thread.CurrentThread.ManagedThreadId);
}
public async static void AwaitTest()
{
Console.WriteLine("AwaitTest Start : {0}", Thread.CurrentThread.ManagedThreadId);
Task t = new Task(DoWork);
t.Start();
await t;
Console.WriteLine("AwaitTest Done : {0}", Thread.CurrentThread.ManagedThreadId);
}
}
}
输出是这样的:
Main Start : 1
AwaitTest Start : 1 <------------ A
DoWork Start: 3
Main End : 1
DoWork End: 3
AwaitTest Done : 3 <------------ B
我的问题是,为什么A和B是在不同的线程?
相同的方法在不同的线程上执行,当线程亲和性很重要时,这会导致问题吗?
您正在控制台应用程序中使用异步无效方法..是真的好吗? – 2013-04-07 16:33:16
@WouterdeKort正如你从输出中看到的那样,它可以工作(因为'ReadLine()'。虽然这是一种不好的做法,不应该在生产代码中完成。 – svick 2013-04-07 16:35:04
@WouterdeKort这是“工作”,因为如果main没有让应用程序像这样运行,你永远无法“等待”async void方法,应用程序可能在任务开始之前退出,不建议使用async void事件处理函数以外的任何其他方法 – 2013-04-07 16:37:19