2016-05-02 14 views
0

私は2つのタスクを並行して実行しており、ここにタスク情報があります。 タスク1 - 起動してアプリケーションを実行します タスク2 - アプリケーションの実行時間を監視します。 30分を超える場合は、タスク1アプリケーションの停止コマンドを発行して、両方のタスクを再開してください。C#で堅牢なスレッド監視を実装する方法は?

タスク1アプリケーションビットが重く、実行時間が長くなるとメモリリークが発生しやすくなります。

私は、この状況でどのように堅牢なスレッド化ソリューションを実装できるのですか?

using QuickTest; 
    using System; 
    using System.Threading; 
    using System.Threading.Tasks; 

    namespace TaskParallelExample 
    { 
    internal class Program 
     { 
     private static void Main(string[] args) 
     { 
     Parallel.Invoke(RunApplication, MonitorApplication); 
    } 

    private static void RunApplication() 
    { 
     Application uftInstance = new Application(); 
     uftInstance.Launch(); 
     QuickTest.Test uftTestInstance = uftInstance.Test; 
     uftInstance.Open(@"C:\Tasks\Test1"); 
     uftInstance.Test.Run(); // It will may run more then 30 mins or less then also. It it exceeds 30 mins which is calculated from Monitor Application. 
    } 

    private static void MonitorApplication() 
    { 
     Application uftInstance = new Application(); 
     try 
     { 
      DateTime uftTestRunMonitor = DateTime.Now; 
      int runningTime = (DateTime.Now - uftTestRunMonitor).Minutes; 
      while (runningTime <= 30) 
      { 
       Thread.Sleep(5000); 
       runningTime = (DateTime.Now - uftTestRunMonitor).Minutes; 
       if (!uftInstance.Test.IsRunning) 
       { 
        break; 
       } 
      } 
     } 
     catch (Exception exception) 
     { 
      //To-do 
     } 
     finally 
     { 
      if (uftInstance.Test.IsRunning) 
      { 
       //Assume it is still running and it is more then 30 mins 
       uftInstance.Test.Stop(); 
       uftInstance.Test.Close(); 
       uftInstance.Quit(); 
      } 
     } 
    } 
} 

}

おかげで、 ラム

+0

私はキャンセルトークンを使用する操作を行います。タスク2は 'token.Cancel();'を設定し、タスク1は 'if(token.IsCancelled)'のようなものをチェックします。 –

+0

ありがとうございます。しかし、私はタスク1のアプリケーションは状態を実行しているので、タスク2のステータスを検証することはできませんし、終了時に出てくるでしょう。 – IamRKY

答えて

1

あなたは30分に設定されたタイムアウトでCancellationTokenSourceを使用してもらえますか?ワーカータスクが定期的に解除状態を確認できない場合は、タスクのタイムアウトを処理するために、NO 堅牢方法がないことを

var task = Task.Run(() => worker(stopAfter30Mins.Token), stopAfter30Mins.Token); 

... 

static void worker(CancellationToken cancellation) 
{ 
    while (true) // Or until work completed. 
    { 
     cancellation.ThrowIfCancellationRequested(); 
     Thread.Sleep(1000); // Simulate work. 
    } 
} 

注:

var stopAfter30Mins = new CancellationTokenSource(TimeSpan.FromMinutes(30)); 

次に、あなたのワーカーメソッドにそれを渡します。

+0

正確に指摘しました。タスク1のアプリケーションは実行状態になり、実行が終了するまで出力されません。 Parallel.Taskを使用してタスク2をタイマーで監視できますか? 30分に達した場合は、タスク1アプリケーションの停止コマンドを発行します。 – IamRKY

+0

@Ram「停止コマンドを発行する」とはどういう意味ですか? 'CancellationTokenSource'は「停止命令を発行します」(これはすべての存在理由です)。非協調的にスレッドを停止させる唯一の方法は 'Thread.Abort()'によるものです。これは非常に堅牢ではありません( 'Thread.Abort() 'をバグとして扱います)。 –

+0

私は、スレッドを停止するのではなく、タスク1アプリケーションの「停止コマンド」を呼び出すことを意味しました。 – IamRKY

0

System.Threading.Tasks.Taskは、ジョブ

CancellationTokenSource cts = new CancellationTokenSource(); 
      CancellationToken token = cts.Token; 
      Task myTask = Task.Factory.StartNew(() => 
      { 
       for (int i = 0; i < 2000; i++) 
       { 
        token.ThrowIfCancellationRequested(); 

        // Body of for loop. 
       } 
      }, token); 

      //Do sometohing else 
      //if cancel needed 
      cts.Cancel(); 
関連する問題