2017-09-06 7 views
0

スレッドを中止、一時停止、または再開する方法は?C#マルチスレッド.abort().suspend().reusme()

で実行時エラーが発生します。 Abort()(オブジェクト参照がオブジェクトインスタンスに設定されていません)、.Resume()および.Suspend()にはObseleteエラーがあります。

私は私のRun()で試しました。Thread.Sleep(1000)しかし、それは使用されたスレッドのインスタンスではないので、動作しません。

どうすればいいですか?

THX

CODE:

class FolderStats : IFolderStats 
{ 
    Thread MyThread = null; 
    private bool x; 
    string Rootpath; 
    List<string> MyList = new List<string>(); 
    Folder FD = new Folder(); 

    public void Connect(string rootpath) 
    { 

     Console.WriteLine(Statuses.Waiting); 
     Thread.Sleep(1000); 

     FD.Path = rootpath; 
     Rootpath = rootpath; 

     Console.WriteLine(Statuses.Connected); 
     Thread.Sleep(1000); 
    } 

    public void Start() 
    { 
     MyThread = new Thread(Run); 
     MyThread.Start(); 
     Console.WriteLine("Starting the Search"); 
    }   
    public void Stop() 
    { 
     MyThread.Abort(); 
     Console.WriteLine("Console Aborted. Please press Enter to Exit"); 
    } 
    public void Pause() 
    { 
     this.x = false; 
     PauseResume(); 
     Console.WriteLine("Console Paused."); 
    } 
    public void Resume() 
    { 
     this.x = true; 
     PauseResume(); 
     Console.WriteLine("Console Resumed."); 
    } 
    private void PauseResume() 
    { 
     while (this.x == false) 
     { 
      Thread.Sleep(100); 
     } 
    } 
    public void Run() 
    { 

     MyThread = new Thread(Start); 
     if (!MyList.Contains(Rootpath)) 
     { 
      MyList.Add(Rootpath); 
      var subDirs = Directory.GetDirectories(Rootpath, "*"); 
      var Data = Directory.GetFiles(Rootpath, "*"); 

      foreach (string dir in subDirs) 
      { 
       Thread.Sleep(2000); 
       Rootpath = dir; 
       Console.WriteLine(dir); 

       Run(); 
      } 
      foreach (string file in Data) 
      { 
       Thread.Sleep(2000); 
       if (!MyList.Contains(file)) 
       { 
        MyList.Add(file); 
        Console.WriteLine(file); 
       } 
      } 
     } 
     FD.NumberOfFiles = MyList.Count; 
    } 
+2

スレッドを中止、一時停止または再開しないでください。何を解決しようとしているのですか? – Dennis

+0

Start()を呼び出した後、バックグラウンドでデータ収集を行う必要があります。停止または一時停止していつでも再開できます。 – k9nneo1191

+3

も参照してください。http://www.albahari.com/threading/ – rene

答えて

1

代わりにタスクを使用して、スレッドを使用しないでください。あなたのタスクを一時停止する場合は、のようなものを実装しようとすることができます

https://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

Task.Run(()=>...); 

あなたは、あなたのタスクは解約作る達成するためにCancellationToken/CancellationTokenSourceを使用することができます:あなたは、新しいタスクを実行することができます これは:

https://blogs.msdn.microsoft.com/pfxteam/2013/01/13/cooperatively-pausing-async-methods/

+1

全く異なるコンセプトを提案すると、実際にOPにこれらの正確なメソッドを使用すべきではない理由が分かりません(一時停止、再開、中止)、代わりに(同じ「スレッディングコンセプト」を使用して)何を行うことができるかを示します。だから、TAPはおそらく行くべき道だが、私はこの答えをupvoteできない。 (しかし、いずれもダウンしません) – Fildor