2016-05-17 5 views
2

私は開発中のサーバーアプリケーションの周りにラッパーを作っています。メモリ、CPU使用率、スレッドとタスク、ヒープ情報などのデバッグ情報を表示し、サーバーを起動および停止する方法。Visual Studioのようなすべてのタスクを列挙する方法タスクウィンドウ

Visual Studioには、非同期アプリケーションをデバッグするための便利なタスクウィンドウがあります。 Id、Status、Start time、Duration and Location、positionの情報を提供します。 私のアプリケーションの中から同じ情報を得ることは可能ですか?私は、生産コードではないので、この情報を得るためにあらゆる種類の反射、ハッキング、文書化されていない汚いものに開放されています。

Visual Studioの[タスク]ウィンドウは、少なくとも2つのタスクが予定されていることを示しているにもかかわらず、私は(ThreadPoolTaskSchedulerオブジェクトである)TaskScheduler.Defaultオブジェクト上の内部メソッドGetScheduledTasksForDebuggerを実行しようとしましたが、それは0タスクを返しました。

Visual Studioの[タスク]ウィンドウ: Visual Studio Task Window

+0

おそらくそれを行うことはできません。 – SLaks

+0

Visual Studioは明らかにできるので、可能だと思います。それはちょっと卑猥なP/Invoke、COMラッピング、Roslynマジック、またはMicrosoft.Diagnostics.Runtimeプロジェクトを必要とするかもしれません。 – AkselK

+1

何かあれば、デバッガが必要です(別のプロセスでなければなりません) – SLaks

答えて

1

のCodePlexで見つけTaskSchedulerのマネージラッパーがあります。

とタスクを列挙することが可能であるラッパーを使用して:

using System; 
using Microsoft.Win32.TaskScheduler; 

namespace ListTasks 
{ 
    class Program 
    { 
     static void EnumFolderTasks(TaskFolder fld) 
     { 
      foreach (Task task in fld.Tasks) 
       DisplayTask(task); 

      foreach (TaskFolder sfld in fld.SubFolders) 
       EnumFolderTasks(sfld); 
     } 

     static void DisplayTask(Task t) 
     { 
      Console.WriteLine("Task: {0, -60} Active: {1, -5} Enabled: {2, -5}", 
           t.Name, t.IsActive, t.Enabled); 
     } 

     static void Main(string[] args) 
     { 
      using (TaskService ts = new TaskService()) 
      { 
       EnumFolderTasks(ts.RootFolder); 
      } 
     } 
    } 
} 

同上かどうかのは、ステータス、時間、期間を開始し、位置情報が利用可能ですが、私はよく分かりません。

しかし、タスクの定義を見て、それが多くの情報が含まれず、一目見ただけで、その情報のほとんどが利用可能であると思わないオブジェクト:

EDIT:追加の名前空間タスクについていくつかの混乱を除去するためにオブジェクト。

namespace Microsoft.Win32.TaskScheduler 
{ 
    public class Task : IDisposable 
    { 
     public TaskDefinition Definition { get; } 
     public bool Enabled { get; set; } 
     public TaskFolder Folder { get; } 
     public bool IsActive { get; } 
     public DateTime LastRunTime { get; } 
     public int LastTaskResult { get; } 
     public string Name { get; } 
     public DateTime NextRunTime { get; } 
     public int NumberOfMissedRuns { get; } 
     public string Path { get; } 
     public bool ReadOnly { get; } 
     public GenericSecurityDescriptor SecurityDescriptor { get; set; } 
     public virtual TaskState State { get; } 
     public TaskService TaskService { get; } 
     public string Xml { get; } 
     public void Dispose(); 
     public void Export(string outputFileName); 
     public TaskSecurity GetAccessControl(); 
     public TaskSecurity GetAccessControl(AccessControlSections includeSections); 
     public RunningTaskCollection GetInstances(); 
     public DateTime GetLastRegistrationTime(); 
     public DateTime[] GetRunTimes(DateTime start, DateTime end, uint count = 0); 
     public string GetSecurityDescriptorSddlForm(SecurityInfos includeSections = SecurityInfos.Owner | SecurityInfos.Group | SecurityInfos.DiscretionaryAcl); 
     public void RegisterChanges(); 
     public RunningTask Run(params string[] parameters); 
     public RunningTask RunEx(TaskRunFlags flags, int sessionID, string user, params string[] parameters); 
     public void SetAccessControl(TaskSecurity taskSecurity); 
     public void SetSecurityDescriptorSddlForm(string sddlForm, TaskSetSecurityOptions options = TaskSetSecurityOptions.None); 
     public void ShowPropertyPage(); 
     public void Stop(); 
     public override string ToString(); 
    } 
}  
+0

申し訳ありませんが、私はWindowsのタスクスケジューラについて質問していませんが、 C#タスクAPIは全く別のものです。 – AkselK

+0

これはC#タスクAPI(特にTPLライブラリ)にあるTaskオブジェクトではありません。これは、リンク先のC#管理対象プロジェクトの一部であるTaskオブジェクトです。その管理ライブラリは、あなたが参照しているWindowsのタスクスケジューラレイヤーの周りのC#ラッパーです。 – jussij

+1

@jussijあなたはそれを後ろに持っていますが、オペレーションはWindowsのタスクスケジューラを参照するのではなく、ビジュアルスタジオのタスクビュー(タスクAPIのタスクを実行するためのもの)を参照しています。彼は、あなたが参照していることはスケジューラーのタスクオブジェクトであり、タスクAPIではないことを知っていますが、答え全体がトピックから外れている –

関連する問題