5

ええと...そのような漠然とした質問をして申し訳ありませんが、私はそれが原因で頭がクラッシュしており、それを実装するための適切なロジック、または少なくともそのようなことを行う優れたライブラリが見つかりません。

状況

私のアプリケーションは、さまざまな時間間隔で多くのタスクを実行する必要があり、そのうちのいくつかは、いくつかの条件が満たされた後、または他のメソッドが完了した後にのみ実行する必要があります。[メソッドの依存関係ツリーと考えてください] ...そして、巨大なオンラインゲームやそのようなプロジェクトのような大きなプロジェクトで、クラッシュしたり、間違った時間にまたはなしでいくつかのメソッドを実行したりしないように、コードをどのように編成するのか疑問に思っていました条件を満たしていますか?

問題

全体の問題は、私のアプリケーションで次の仕様が必要だということです

  • 指定した時間にメソッドを実行するようにスケジュールする機能。
  • タスクを一時停止、キャンセル、停止、さらには繰り返す機能。
  • ある種のフローを作成できるように、別のタスクが完了するまで特定のタスクを実行しない機能。
  • 親メソッドまたはプロシージャ メソッドが終了するまで一部のメソッドが実行されないようにするために、ある種のフローを作成する機能。
  • そのすべてが、組織的で流暢かつ強力な方法で行われます。
4

1 に答える 1

7

Reactive Extensions (Rx.NET) が役に立ちます! http://msdn.microsoft.com/en-us/data/gg577609.aspx

例:

この例では、タスクの実行をスケジュールします。

Console.WriteLine("Current time: {0}", DateTime.Now);

// Start event 30 seconds from now.
IObservable<long> observable = Observable.Timer(TimeSpan.FromSeconds(30));

// Token for cancelation
CancellationTokenSource source = new CancellationTokenSource();

// Create task to execute.
Task task = new Task(() => Console.WriteLine("Action started at: {0}", DateTime.Now));

// Subscribe the obserable to the task on execution.
observable.Subscribe(x => task.Start(), source.Token);

// If you want to cancel the task do: 
//source.Cancel();

 Console.WriteLine("Press any key to exit");
 Console.ReadKey();

結果: ここに画像の説明を入力

例 2:

x 秒ごとにタスクを繰り返します。

Console.WriteLine("Current time: {0}", DateTime.Now);

// Repeat every 2 seconds.
IObservable<long> observable = Observable.Interval(TimeSpan.FromSeconds(2));

// Token for cancelation
CancellationTokenSource source = new CancellationTokenSource();

// Create task to execute.
Action action = (() => Console.WriteLine("Action started at: {0}", DateTime.Now));

// Subscribe the obserable to the task on execution.
observable.Subscribe(x => { Task task = new Task(action);task.Start(); },source.Token);

// If you want to cancel the task do: 
//source.Cancel();
Console.WriteLine("Press any key to exit");
Console.ReadKey();

結果: ここに画像の説明を入力

例のタスクの続き:

Console.WriteLine("Current time: {0}", DateTime.Now);

        // Repeat every 2 seconds.
        IObservable<long> observable = Observable.Interval(TimeSpan.FromSeconds(2));

        // Token for cancelation
        CancellationTokenSource source = new CancellationTokenSource();

        // Create task to execute.
        Action action = (() => Console.WriteLine("Action started at: {0}", DateTime.Now));
        Action resumeAction = (() => Console.WriteLine("Second action started at {0}", DateTime.Now));

        // Subscribe the obserable to the task on execution.
        observable.Subscribe(x => { Task task = new Task(action); task.Start();
                                      task.ContinueWith(c => resumeAction());
        }, source.Token);

        // If you want to cancel the task do: 
        //source.Cancel();
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();

結果:

ここに画像の説明を入力

于 2013-07-26T20:10:23.413 に答える