2015-07-02 60 views
-1

以及我是新來的C#,並實現代碼,其中我有兩個按鈕,其中一個作爲開始數據採集和存儲在一個csv文件和其他按鈕來停止它。對於所有這些需要某種循環或跳轉語句爲我的代碼

以及代碼如下:

//按鈕開始DAQ

private void stdaq_Click(object sender, EventArgs e) 
    { 
     stopped = false; 

     process(); 


    } 

//按鈕回採DAQ

private void spdaq_Click(object sender, EventArgs e) 
    { 

     stopped = true; 
    } 

//處理功能

private process() 
    { 
      int iAvail = 0; 
      int iRead = 0; 

      string filename = @textBox3.Text;// taking csv file name from user 
     // jit: 

      //a function calculating the total number of values and storing it in iAvail 



      int[] iRawData = new Int32[iAvail]; 
      double[] dScaledData = new Double[iAvail]; 


      //a function transferring the data from buffer and storing it in dscaledData array 

      List<double> data = new List<double>(); 
      for (int i = 0; i < iAvail; i++) 
      { 
       data.Add(dScaledData[i]); 
      } 

      Task myFirstTask = Task.Factory.StartNew(() 
            => 
            { 
             while (stopped == false) 
             { 
              Write(data.ToArray(), filename); 
              // goto jit; 
             } 
            }); 


    } 

// CSV創世和數據寫入

public static void Write(double[] data, string outputPath) 
    { 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < data.GetLength(0); i++) 
     { 
      if (stopped) break; 
      sb.AppendLine(string.Join(",", data[i])); 
     } 

     if (File.Exists(outputPath)) 
     { 
      File.AppendAllText(outputPath, sb.ToString()); 
     } 
     else 
     { 
      File.WriteAllText(outputPath, sb.ToString()); 
     } 
    } 

這就是我在執行,以及與此代碼的問題是,當數據被首先傳送和寫入文件,然後再次相同的數據一次又一次不論寫的新數據,我試圖實現該Goto語句(可以在評論中看到),但它給錯誤 - 「控制不能離開匿名方法或lambda表達式的主體」,如果我不使用While循環的數據根本不寫。

所以我想打電話給我的過程函數並將數據傳輸到csv開始按一個開始按鈕,每次採取新的數據並寫入csv或可以說從它的起點再次調用過程方法,並且停止它點擊停止按鈕,但我無法做到這一點,不管各種不同循環和一些線程函數的嘗試。

請幫忙。

+0

這也許是因爲'從緩衝區傳輸數據並將其存儲在dscaledData array'的功能是不是在循環。 – Dzienny

+0

@Dzienny,請給我一些代碼爲相同的 –

回答

1

假設你只需要Write一次,你應該刪除這也從while改爲if

while (stopped == false) 

循環將導致Write被稱爲無限直到stopped變得true

此外,您可能要更改Writereturn,而不是break如果stoppedtrue,讓你不寫任何東西,如果你都應該被阻止:

 if (stopped) break; 

 if (stopped) return; 

如果您想再次生成data,並且確實想循環前進R,只要將代碼進入死循環:

Task myFirstTask = Task.Factory.StartNew(() 
    => 
    { 
     while (stopped == false) 
     { 
      List<double> data = new List<double>(); 
      // TODO: Generate data here - move all relevant code here 

      Write(data.ToArray(), filename); 
     } 
    }); 
+0

,雖然它就像我想一次又一次檢查緩衝區,但如果數據是多餘的,那麼只需保留該數據並停止在那裏 –

+0

你只分配給'數據'一次,所以如果你保留循環,你會一遍又一遍地寫同樣的數據... –

+0

請給出一些相同的代碼,我有三合會各種命中和試驗,有些時候它給輸出有時它只是空閒並僅在開始點擊時給出輸出,所以完全混淆 –

0

我覺得這是對BackgroundWorker的工作。

此代碼將啓動您:

public partial class Form1 : Form 
{ 
    int loopCounter = 0;  // variable just used for illustration  
    private static BackgroundWorker bw = new BackgroundWorker();  // The worker object 

    // This function does your task 
    public void doSomeStuff(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      loopCounter = i; // Pass the loop count to this variable just to report later how far the loop was when the worker got cancelled. 
      Thread.Sleep(100); // Slow down the loop 

      // During your loop check if the user wants to cancel 
      if (bw.CancellationPending) 
      { 
       e.Cancel = true; 
       return; // quit loop 
      } 
     } 
    } 

    // This button starts your task when pressed 
    private void button1_Click(object sender, EventArgs e) 
    { 
     bw.WorkerSupportsCancellation = true; // Set the worker to support cancellation 
     bw.DoWork += doSomeStuff;    // initialize the event 
     if (!bw.IsBusy)       // Only proceed to start the worker if it is not already running. 
     { 
      bw.RunWorkerAsync();    // Start the worker 
     } 
    } 

    // This button stops your task when pressed 
    private void button2_Click(object sender, EventArgs e) 
    { 
     // Request cancellation 
     bw.CancelAsync(); 

     textBox1.Text = "The bw was cancelled when 'loopCounter' was at: " + loopCounter.ToString(); 

    } 

}