在 Xamarin PCL 中获取线程信息
Posted
技术标签:
【中文标题】在 Xamarin PCL 中获取线程信息【英文标题】:Get thread information in Xamarin PCL 【发布时间】:2016-09-16 06:12:07 【问题描述】:我从 PCL 开始一些并行任务
Parallel.Invoke(() => ExecuteTaskAAsync(), () => ExecuteTaskBAsync());
现在我想知道这些任务在哪个线程上运行。
Thread.CurrentThread.ManagedThreadId
似乎只在 ios 中可用
和 Droid 项目,但不在 PCL 或 UWP 项目中。我的可能性是什么?如果我使用DependencyService
,我也不知道TaskA在哪个线程上运行,因为启动的任务和DependencyService
之间没有关系。
如何在 PCL 中获取线程信息(id、名称、...)?
设置断点后,您可以进入Tasks Window 并获取更多信息。此外,您在顶部有一个下拉菜单来选择一个进程,在不同的线程之间进行选择并获取有关堆栈帧的一些信息。那么应该也可以在代码中获取这些信息吗?
编辑:
似乎任务窗口中的信息只有在 UWP 上运行时才可用。
【问题讨论】:
显式线程ID真的是必需品吗?如果不是,您可以检查“SynchronizationContext.Current”并检查它们是否等于某些存储的参考。 不,不是。我想在日志文件中包含一些线程信息,以查看来自哪个线程的内容。通过您的比较方法,我只能查看它是否是非 UI 线程?在我的示例应用程序中,SynchronizationContext
是 null
。
您可以在Visual Studio中设置TracePoints,在这里您可以将线程ID输出到调试窗口。
现在我尝试使用动作context = context
设置断点,而SynchronizationContext context = SynchronizationContext.Current;
。结果是context = (null)
。然后我用thread = $TID
试了一下,结果是thread = 0x6
。你是那个意思吗?如何在代码中访问类似的内容?
刚找到这个:github.com/dotnet/corefx/issues/2576 所以看起来你的问题的答案是,目前不可能。如果TaskSchedule.Current
能帮到你,你可以试试。
【参考方案1】:
Windows 通用应用程序中完全没有线程的概念,建议使用任务而不是线程。
我还没有找到有关其背后原因的官方文档,但有一个正在进行的讨论 at the CoreFX's github repo。
因此,如果您想支持 UWP 项目,目前看来您正在寻找的东西是不可能的。
您也可以寻找管理当前正在运行的任务的TaskScheduler
:
var poolId = TaskScheduler.Current.Id;
这样你至少可以查明你的方法是否在同一个ThreadPool上运行(例如:它们在任何后台线程或UI线程上执行)。
据我所知,要找到 UI 的 TaskScheduler,您必须在 UI 线程上调用 TaskScheduler.Current.Id
并将其存储在变量中。
【讨论】:
【参考方案2】:这对我有用
Environment.CurrentManagedThreadId
【讨论】:
以上是关于在 Xamarin PCL 中获取线程信息的主要内容,如果未能解决你的问题,请参考以下文章
将文件下载进度从 PCL 更新到 Xamarin.Android
升级到 Visual Studio 16.11.1 后,Xamarin Forms 破坏了 XANS 7028:System.IO.FileNotFoundException:无法加载程序集“Xama
Xamarin PCL 项目中的 HttpClient 访问失败