2016-02-13 88 views
2

我正在編寫一個應用程序,其中一個其他窗體應用程序將寫入該文件,然後我的文件將讀取該文件並執行一些需要約2小時的時間的任務。所以我想實現線程化,以便每當文件長度變得大於零時,我的應用程序應該啓動一個線程,然後主線程應該開始查找文件大小,並且如果文件的某個時間長度再次變得大於零,那麼主線程應該單獨的線程。一旦任務完成後,所有的應該停止。多線程和C#異常。文件正在被另一個進程使用

請建議我如何才能做到這一點,也有如下的我的代碼來看看:

的窗口形式的應用程序代碼:

const string [email protected]"C:\Users\abc\Documents\input.txt"; 
     try { 
       using (FileStream fs = File.Open(inputfile, FileMode.Open)) 
       { 
        using (StreamWriter writer = new StreamWriter(fs)) 
        { 
         writer.Write(textBox1.Text); 
         button1.Enabled = false; 
         writer.Close(); 
         fs.Close(); 
        } 

       } 

      } 
     catch(Exception ex) 
     { 
      MessageBox.Show("File is locked by some process try again"); 
      Thread.Sleep(10*1000); 
      Application.Exit(); 
     } 

我的應用程序代碼:

static void Main(string[] args) 
    { 

     while(true) 
     { 
      FileInfo fi = new FileInfo(inputfile); 
       if(fi.Length>0) 
       { 
        Thread th1=new Thread(new ThreadStart(ThreadingTest.runCommand)); 
        th1.Start(); 
        if(Variable.stop) 
        th1.Abort(); 

       } 
       else 
       { 
        Console.WriteLine("File.Empty"); 
        Thread.Sleep(30 * 1000); 
       } 
     } 

當我運行我的應用程序時,我得到一個異常「C#異常。文件正在被另一個進程使用」請提出一些關於我的方法的有用的觀點。

+0

您可以使用其他文件進行同步。例如,創建一個文件「我的更新完成」,當它被創建時,其他進程可以嘗試讀取原始文件。之後,它可以刪除同步文件以通知其他進程。 – Eser

回答

0

您可以通過訂閱onChanged事件來使用FileSystemWatcher監視該文件,而不是在循環中執行此操作。你可以找到一些文檔和示例在這裏:https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx

該文件可能仍然被其他進程被鎖定,所以嘗試打開它,直到它變爲解鎖:

while(true) 
{ 
    try { 
      /* open and process file */ 
      break; 
    } 
    catch(Exception e) 
    { 
      /* file unavailable */ 
    } 

    Thread.Sleep(100); // Wait for the file to be available 
} 
0

首先,你不希望使用Thread.Abort()。其次,如果您可以修改文件創建應用程序,則表明文件已準備好(通過創建另一個文件作爲標記或釋放已命名的互斥體或通過遠程處理或wcf ...)。或者讓應用程序每次創建一個新文件(使用唯一的名稱)。

如果這種修改是不可能的,則必須將文件鎖用作同步機制。這意味着只需嘗試重複打開它,並希望在文件創建應用再次獲取鎖定之前不要錯過時間。

相關問題