2016-11-22 48 views
0

問題:我有一個程序用一些命令讀取文本腳本文件,這些命令通過串口發送給某些硬件。例如。向左移動機器人10秒。在腳本中我有一些關鍵字,例如。 #delay它們被分析腳本並在檢測到'#'關鍵字時執行某些操作的函數識別。在延遲的情況下,我想延遲X毫秒的時間,而不會使UI停止響應,所以如果腳本正在運行,我仍然可以暫停或停止腳本。目前正在使用我想擺脫的Thread.Sleep。C#串口延時沒有阻塞UI

嘗試:我試圖使用定時器,如:

public void delay(int ms) { 
     System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 
     timer.Interval = ms; 
     timer.Tick += (s, o) => {timer.Enabled = false; timer.Dispose(); Application.DoEvents();}; 
     timer.Enabled = true; 
    } 

或者:

// Delay Function 
    private void delay(int ms) 
    { 
     if (ms < 100) return; 
     DateTime delay_amount = DateTime.Now.AddMilliseconds(ms); 
     while (DateTime.Now < delay_amount) { 
      Application.DoEvents(); 
     } 
    } 

我試圖啓動腳本上一個新的線程讀取功能,但我不能,因爲它使用主線程使用的一些組合框...... 所有這些解決方案都讓我的用戶界面無法響應。有人可以幫幫我嗎? 我的目標是.NET 4.0。

+1

使用'等待Task.Delay'和使用'await'關鍵字之前更改調用的方法來'私人async'。 – Fabio

+0

創建新線程並使用Invoke訪問UI線程中的組合框 –

+0

爲處理腳本創建自己的線程(類)。使用UI僅用於控制它,閱讀狀態/進度等 – apocalypse

回答

0

//嘗試沿着這些路線工作:

async Task MyMainMethod() 
{ 

    await Task.Run(()=> delay(1000)); 

} 
+0

我以爲你需要使用.NET 4.5的異步的東西? – Filip

+0

看看這個答案:http://stackoverflow.com/questions/9110472/using-async-await-on-net-4 – agfc

+0

似乎很愚蠢的經歷這麼簡單的事情這麼多的麻煩。我想我需要一些指導來製作另一個線程。 – Filip