0

後臺工作器在被調用時將文本附加到閃爍控制器上時停止控件,這裏是部分代碼。添加try catch邏輯後,我仍然沒有得到任何例外!使用scintilla NET停止在backgroundworker線程中不凍結GUI

private delegate void DWrite(string text); 
    private void Write(string text) 
    { 
     try 
     { 
      scintilla1.AppendText(text); 
     } 
     catch (Exception ex) { MessageBox.Show(ex.ToString()); } 

    } 


    private void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     string x; 
     while (true) 
     { 
      x = tcw.Read(); 
      // MessageBox.Show(x); 
      Thread.Sleep(100); 
      try 
      { 
       scintilla1.Invoke(new DWrite(Write), x); 
      } 
      catch (Exception ex) { MessageBox.Show(ex.ToString()); } 
     // scintilla1.Update(); 
     } 

我加了這樣的邏輯:

static void MyHandler(object sender, UnhandledExceptionEventArgs args) 
    { 
     Exception e = (Exception)args.ExceptionObject; 
     MessageBox.Show("MyHandler caught : " + e.Message); 
    } 

    public void doworkstuff() 
    { 
     AppDomain currentDomain = AppDomain.CurrentDomain; 
     currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); 
     try 
     { 
      for (int i = 0; i < 5; i++) 
       scintilla1.Invoke(new DWrite(Write), tcw.Read()); 
     } 
     catch (Exception ex) 
     { MessageBox.Show(ex.ToString()); } 
    } 

這個問題似乎是與控制它的自我,而不是允許外部線程訪問,以避免死鎖。有沒有一種方法可以在不使用BGWorker的情況下獲得相同的功能? tcw.read()是一個telnet客戶端,它將輸入流傳輸到控件,我希望流(即tcw.read())繼續,直到用戶按下窗體上的停止!

+0

哪裏是啓動後臺工作的代碼?它阻塞等待後臺工作者的線程嗎? – Servy 2013-02-11 20:24:12

+0

什麼是例外? – 2013-02-11 20:34:34

+0

調用其按鈕單擊方法,該方法寫入scintillaNET配置文件,然後發出bw.RunWorkerAsync(); – CodeEmpower 2013-02-11 20:34:59

回答

3

您已經在ScintillaNET中發現了一個錯誤。

要處理託管的Scintilla包裝和本機Scintilla控件之間的互操作,ScintillaNET將重寫WndProc方法。這樣做,似乎Windows窗體機制封送回UI線程的調用已被打破。

與此同時,您可以使用BackgroundWorker.ProgressChanged事件來準確執行您嘗試的定期UI更新的類型。

確保你已經設置的BackgroundWorker.WorkerReportsProgress屬性true,讓你在的地方您的Invoke方法的使用BackgroundWorker.ReportProgress方法修改代碼並處理ProgressChanged事件之後。

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 
    string x; 
    while (true) 
    { 
     x = "Your telnet data"; 
     Thread.Sleep(100); 
     worker.ReportProgress(-1, x); 
    } 
} 

private void bg_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    string text = e.UserState as string; 
    scintilla1.AppendText(text); 
} 

(全面披露:我是一個ScintillaNET開發商)

0

你應該把一些破壞條件,你的while循環是無限的! 如果使用BeginInvoke而不是Invoke,後臺工作人員不會停止!

scintilla1.BeginInvoke(new DWrite(Write), x); 
+0

不,我試圖循環這樣看,如果這是什麼造成的問題; int = 0;同時(i <5) {i ++; //相同的代碼}。 相同的行爲 – CodeEmpower 2013-02-11 20:54:52

+0

你試過簡單的調用沒有while循環的方法嗎? – Igoy 2013-02-11 20:56:45

+0

沒有時間,使用BeginInvoke,同樣的行爲! – CodeEmpower 2013-02-11 21:04:39