2017-09-15 66 views
0

對於我的項目,我需要觸發一個方法,它在給定目錄內創建文件後,更改某些文本框中的文本。創建FileSystemWatcher後訪問WindowsForms的問題

因此,我用了一個FileSystemWatcher的,並增加了事件處理它,你可以在這裏看到:

private void watch() 
    { 

     watcher = new FileSystemWatcher(); 
     watcher.Path = path; 
     watcher.Filter = "*.osr"; 
     watcher.Created += new FileSystemEventHandler(OnChanged); 
     watcher.EnableRaisingEvents = true; 
    } 

創建一個文件後,FileSystemWatcher的成功觸發的方法,但是當我想拋出一個錯誤訪問文本框。

textBox.Text = path; //Error here 

的錯誤是:「System.InvalidOperationException」,它說,那我想從另一個線程訪問WindowsForms,但我從來沒有創建另一個線程...

的有趣的事情是,我也有一個按鈕來手動完成整個事情(所以手動打開一個文件),它在那裏工作得非常好。

你能告訴我爲什麼它在另一個線程或我如何修復它?

感謝

回答

2

當前,您的FileSystemWatcher在一個線程上,而您的UI在另一個線程上。

您需要使用BeginInvoke調用它,因此它將在您的UI的同一線程中「管理」。

事情是這樣的:

public partial class Form1 : Form 
{ 
    delegate void FileCreationUpdater(FileSystemEventArgs evt); 
    FileSystemWatcher watcher = null; 
    public Form1() 
    { 
     InitializeComponent(); 

     // instantiate a new FileSystemWatcher 
     watcher = new FileSystemWatcher(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)) 
     { 
      // and starts it right away 
      EnableRaisingEvents = true 
     }; 

     // create a new updater delegate 
     FileCreationUpdater updater = new FileCreationUpdater(TextBoxUpdater); 

     // when receiving Created events, Invoke updater. 
     watcher.Created += (s, e) => 
     { 
      /// passing parameter to the invoked method 
      textBox1.BeginInvoke(updater, e); 
     }; 
    } 

    public void TextBoxUpdater(FileSystemEventArgs evt) 
    { 
     /// update path 
     textBox1.Text = evt.FullPath; 
    } 
} 
0

的FileSystemWatcher對象將在一個單獨的線程運行,因此,而不是試圖讀取來自其他線程的路徑只​​是做一個查找目錄,看看發生了什麼變化。對不起,很難給出一個完整的答案。

+0

好吧,這樣回答錯誤,但我需要檢查的全部時間,每次一個新文件被創建,我需要觸發的方法。我能以某種方式改變窗體的文本,甚至從其他線程? –