在 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 线程?在我的示例应用程序中,SynchronizationContextnull 您可以在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

Xamarin: MVVM交叉信息

升级到 Visual Studio 16.11.1 后,Xamarin Forms 破坏了 XANS 7028:System.IO.FileNotFoundException:无法加载程序集“Xama

Xamarin PCL 项目中的 HttpClient 访问失败

为啥我不能在 Xamarin Forms 中选择 PCL 项目?

如何使用 PCL 支持从 xamarin 跨平台项目中的 URL 下载文件