2016-10-31 5 views
-3

停止するにはフラグを基にしたスレッドFinesedequeue以下のスレッドメソッドでは、停止ボタンでループを実行しました(目的は_textFromFilesQueueという名前のキューを埋めた後にこのスレッドを停止することです)これで主な問題は、私のフォームが凍結されていることである。ここ キューをいっぱいにした後にスレッドを停止する

は私のコードです:スレッドメソッド

public static bool Finisedqueue ; 
    public void Read(string inputDirectoryPath) 
    { 

     try 
     { 
      Thread.CurrentThread.IsBackground = true; 
      Finisedqueue = false; 
      Console.WriteLine("thread 1 started"); 
      if (Form1.IsStarted) 
      { 
       Thread.Sleep(3000); 
       var dir = new DirectoryInfo(inputDirectoryPath); 
       FileInfo[] f = dir.GetFiles("*.txt"); 
       if (f.Length > 0) 
       { 
        Console.WriteLine("{0} directory contains {1} Files",inputDirectoryPath,f.Length); 
        int counter = 0; 
        foreach (System.IO.FileInfo fi in f) 
        { 

         counter++; 
         var filePath = Path.Combine(fi.DirectoryName, fi.Name); 
         string textFromFile = File.ReadAllText(filePath); 
         _textFromFilesQueue.Enqueue(textFromFile); 
         Console.WriteLine("The text inside file number {0} is : {1}",counter,textFromFile); 
         fi.Delete(); 
         Console.WriteLine("deleting file number {0} from input folder",counter); 


        } 
        Finisedqueue = true; 
        Console.WriteLine("finished Deleting files"); 
       } 

       else 
       { 
        Console.WriteLine("{0} Has no files inside it ",inputDirectoryPath); 
       } 
      } 

     } 
     catch (Exception excep) 
     { 
      Console.WriteLine("An error occurred: '{0}'", excep); 
      throw(excep); 

     } 
    } 

停止ボタンをクリックして:

あなたが他のスレッドに実行する機会を与えるように、それを待って、眠ることは良いアイデアである場合には忙しい10
 private void stop_Click(object sender, EventArgs e) 
    { 

     while (!Thread1.Finisedqueue) 
     { 
      Console.WriteLine("Queue from First Thread is still Enqueuing data"); 
     } 
     Thread1Timer.Dispose(); 
     button3.Enabled = true; 
     textBox3.Enabled = true; 



    } 
> the main problem in this is that my form is freezing 

すべてのボディは、この中で私を助けることができるかどうかは非常に多くの

+0

あなたのフォームはwhileループでフリーズします。 –

+0

どうすればこの問題を解決できますか? –

+0

あなたのStopClickは何も停止しておらず、すべての作業が完了するまでハングアップします。 –

答えて

-1

、ありがとうございました。

while (!Thread1.Finisedqueue) 
{ 
    Thread.Sleep(100); 
    Console.WriteLine("Queue from First Thread is still Enqueuing data"); 
} 

また、ファイルIOなど、非同期操作のための素晴らしいですし、内蔵のasync/await機能を使用してawaitableあるTaskクラス https://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v=vs.110).aspxをチェックアウトすることができます。

private Queue<string> q = new Queue<string>(); 
private Task readFilesTask; 
public void ReadFiles(string inputDirectory) 
{ 
    var files = Directory.GetFiles(inputDirectory, "*.txt", SearchOption.TopDirectoryOnly); 
    foreach (var file in files) 
    { 
     var textFromFile = File.ReadAllText(file); 
     q.Enqueue(textFromFile); 
     File.Delete(file); 
    } 
} 

private void start_Click(object sender, EventArgs e) 
{ 
    readFilesTask = Task.Run(() => ReadFiles("//path/to/dir")); 
} 

private void stop_Click(object sender, EventArgs e) 
{  
    readFilesTask.Wait(); 
    //readFilesTask.Wait(1000); // if you want kill the task after waiting for 1000 milliseconds 
    //Enable buttons 
} 
+0

これは醜く間違っています。すべてのスレッドスリープを強制終了します。 –

+0

これを行うことができれば、より良いパフォーマンスのためにThread.Yieldメソッドを使用することもできます(これは.NETのバージョンによって異なる場合があります)。 – VMAtm

+0

私は状況を変えてそれは私のコードで!ありがとう –

関連する問題