2016-05-19 5 views
4

я начинаю несколько параллельных задач от PCL сПолучить информацию о нити в Xamarin PCL

Parallel.Invoke(() => ExecuteTaskAAsync(),() => ExecuteTaskBAsync());

Теперь я хочу знать, на какой нить эти задачи выполняются.

Thread.CurrentThread.ManagedThreadId, похоже, доступен только в iOS и проекте Droid, но не в проекте PCL или UWP. Каковы мои возможности? Если я буду использовать DependencyService, я также не буду знать, на каком потоке TaskA запущен, потому что нет никакой связи между запущенной задачей и DependencyService.

Как я могу получить информацию о потоке (id, name, ...) в PCL?

Когда вы устанавливаете точку останова, вы можете попасть в Tasks Window и получить дополнительную информацию. Также у вас есть выпадающее меню, чтобы выбрать процесс, выбрать один из разных потоков и получить некоторую информацию о фрейме стека. Так можно также получить эту информацию в коде?

Edit:

Кажется, что информация в окне Задачи доступна только при работе на UWP.

+0

Является ли явным идентификатором потока действительно требование? Если нет, вы можете проверить «SynchronizationContext.Current» и проверить, соответствуют ли они какой-либо сохраненной ссылке. –

+0

Нет, это не так. Я хочу включить в файл журнала информацию о потоках, чтобы узнать, что из этого потока. С вашим сравнительным подходом я могу только увидеть, является ли это нелиний пользовательский интерфейс? В моем примере приложение 'SynchronizationContext' было' null'. – testing

+0

Вы можете установить TracePoints в Visual Studio, где вы можете вывести идентификатор потока в окно отладки. –

ответ

3

Концепция потоков полностью отсутствует в Windows Universal Apps, и вместо задач рекомендуется использовать задачи.

Я не нашел официальную документацию по причинам, лежащим в ее основе, но продолжается обсуждение at the CoreFX's github repo.

Таким образом, похоже, что то, что вы ищете, в настоящее время невозможно, если вы хотите поддерживать проекты UWP.

в качестве альтернативы Вы Мал искать TaskScheduler, которая управляет в настоящее время работает задача:

var poolId = TaskScheduler.Current.Id; 

Таким образом, вы можете по крайней мере узнать, если ваш метод работает на том же ThreadPool (например: Они выполняется на любых фоновых потоках или потоке пользовательского интерфейса).

Насколько я знаю, чтобы найти TaskScheduler для пользовательского интерфейса, вам нужно позвонить TaskScheduler.Current.Id, пока вы находитесь в потоке пользовательского интерфейса, и просто сохраните его в переменной.

Смежные вопросы