c#-如何确定使用TPL时方法将在哪个线程上执行?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-如何确定使用TPL时方法将在哪个线程上执行?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2082字,纯文字阅读大概需要3分钟。
内容图文
![c#-如何确定使用TPL时方法将在哪个线程上执行?](/upload/InfoBanner/zyjiaocheng/677/ed9b46c2912043499c30a79a542dce99.jpg)
我知道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在不同的线程上?
在不同的线程上执行相同的方法,当线程亲和力很重要时,这会引起问题吗?
解决方法:
why A and B is on different thread?
首先,如果您的任务是由默认调度程序安排的,则不能保证任务将在哪个线程上运行.而且AwaitTest()的各个部分分别执行,因此不能保证它们将在同一线程上运行.
其次,默认调度程序使用ThreadPool执行任务.每个异步方法的第一部分都是同步运行的.在您的情况下,这意味着AwaitTest()的第一部分将在主线程上运行,第二部分将在某些ThreadPool线程上运行.因此,实际上可以确保它们不会在同一线程上运行.
will this cause issue when thread affinity is important?
当然可以.但是,在线程亲和力很重要的最常见情况下,它可以正常工作:GUI编程.这是因为GUI应用程序已设置SynchronizationContext,这意味着,如果异步方法的第一部分在UI线程上运行,则第二部分也将在此处运行(除非您通过使用ConfigureAwait(false)禁用它).
但是在其他情况下,它将引起问题.例如,使用以下代码:
Monitor.Enter(lockObject);
await someTask;
Monitor.Exit(lockObject);
这段代码在控制台应用程序中不起作用(Exit()很可能引发SynchronizationLockException),因为Exit()可以在与Enter()不同的线程上运行.
内容总结
以上是互联网集市为您收集整理的c#-如何确定使用TPL时方法将在哪个线程上执行?全部内容,希望文章能够帮你解决c#-如何确定使用TPL时方法将在哪个线程上执行?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。