2016-05-19 16 views
4

にスレッド情報を取得しますが、私はXamarin PCL

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

今、私はどのスレッド上でこれらのタスクが実行されているかを知りたいとPCLからいくつかの並列タスクを起動します。

Thread.CurrentThread.ManagedThreadIdは、iOS とDroidプロジェクトでのみ使用できますが、PCLまたはUWPプロジェクトでは使用できないようです。私の可能性は何ですか?もし私がDependencyServiceを使用するのであれば、起動されたタスクとDependencyServiceの間に関係がないので、TaskAが実行中のスレッドについてもわかりません。

PCLでスレッド情報(ID、名前、...)を取得するにはどうすればよいですか?

ブレークポイントを設定すると、Tasks Windowに入り、さらに詳しい情報が得られます。また、トップダウンでプロセスを選択し、異なるスレッドを選択して、スタックフレームに関する情報を取得します。ですから、この情報をコードで入手できるはずですか?

編集:

UWP上で動作しているとき、タスクウィンドウ内の情報のみが利用可能であると思われます。

+0

明示的なスレッドIDは本当に要件ですか?そうでない場合は、 'SynchronizationContext.Current'をチェックし、それらがいくつかの格納されている参照と等しいかどうかを調べることができます。 –

+0

いいえ、そうではありません。私は、どのスレッドから来たのかを知るために、いくつかのスレッド情報をログファイルに含めたいと思っています。あなたの比較アプローチでは、私はそれが非UIスレッドの場合のみ見ることができますか?私のサンプルアプリケーションでは、 'SynchronizationContext'は' null'でした。 – testing

+0

Visual StudioでTracePointsを設定すると、スレッドIDをデバッグウィンドウに出力できます。 –

答えて

3

WindowsのUniversal Appsではスレッドの概念は完全に存在せず、スレッドの代わりにタスクの使用が推奨されています。

私はそれの背後にある理由についての公式文書を見つけられませんでしたが、進行中の議論がありますat the CoreFX's github repo

UWPプロジェクトをサポートしたい場合は、探しているように見えます。

あなたが代わりに現在実行中のタスク管理TaskSchedulerを探しMAL:彼らは、次のとおりです。あなたの方法は同じThreadPoolの(例えば上で実行されている場合は、少なくとも、見つけることができます

var poolId = TaskScheduler.Current.Id; 

この道を任意のバックグラウンドスレッド、またはUIスレッドで実行されます)。

私が知る限り、UIのTaskSchedulerを見つけるには、UIスレッド上でTaskScheduler.Current.Idを呼び出して変数に格納するだけです。

関連する問題