2015-07-02 58 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(); 

    } 

}