4

実行中のタスクを確認する方法がわかりません。Task.Current プロパティがありますが、複数のタスクが実行されている場合はどうでしょうか。この種の情報を取得する方法はありますか?

または、タスクの開始時または完了時に通知を受け取る組み込みの方法はありますか?

4

3 に答える 3

3

ちょっとマイク、TPLの保留中のタスクのリストにアクセスする公的な方法はありません。デバッガーで使用できるようにするメカニズムは、列挙時にすべてのスレッドがフリーズされるという事実に依存しているため、実行時に使用することはできません。

はい、タスクが完了したときに通知を受け取る方法が組み込まれています。Task.ContinueWithAPIを確認してください。基本的に、このAPIは、ターゲットタスクが完了したときに起動される新しいタスクを作成します。

これに基づいて簡単なアカウンティング/進捗レポートを作成することを想定しています。その場合は、TaskContinuationOptions.ExecuteSynchronouslyフラグを指定してtask.ContinueWith()を呼び出すことをお勧めします。ターゲットタスクの終了時に継続アクションが同じスレッドで実行されるように指定すると(これを指定しない場合、継続タスクは他の通常のタスクと同様にキューに入れられます)。

お役に立てれば。

フセイン

于 2009-10-29T22:15:45.783 に答える
3

リフレクションを使用して、現在実行中のタスク (またはタスクの親) を取得することもできます。

static public class Extensions
{
    public static Task Parent(this Task t)
    {
        FieldInfo info = typeof(Task).GetField("m_parent", 
            BindingFlags.NonPublic | BindingFlags.Instance);
        return info != null ? (Task)info.GetValue(t) : null;
    }
    public static Task Self
    {
        get
        {
            return Task.Factory.StartNew(
                () => { },
                CancellationToken.None,
                TaskCreationOptions.AttachedToParent,
                TaskScheduler.Default).Parent();
        }
    }
};
于 2010-11-19T03:15:38.813 に答える
2

TaskScheduler提供されたクラスから派生したクラスを作成できます。そのクラス内では、完全に制御でき、実行のいずれかの側にログを追加できます。例を参照してください: http://msdn.microsoft.com/en-us/library/ee789351.aspx

Taskfactoryまた、スケジューラとしてクラスのインスタンスでa を使用する必要があります。

于 2010-09-02T06:52:12.353 に答える