Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的代码需要某种循环或跳转语句_C#_.net_Winforms_Csv - Fatal编程技术网

C# 我的代码需要某种循环或跳转语句

C# 我的代码需要某种循环或跳转语句,c#,.net,winforms,csv,C#,.net,Winforms,Csv,我是C#新手,实现了一个代码,其中我有两个按钮,一个作为数据采集的开始并存储在csv文件中,另一个按钮用于停止数据采集 所有这些井的井码如下: //启动数据采集按钮 private void stdaq_Click(object sender, EventArgs e) { stopped = false; process(); } //停止DAQ的按钮 private void spdaq_Click(object send

我是C#新手,实现了一个代码,其中我有两个按钮,一个作为数据采集的开始并存储在csv文件中,另一个按钮用于停止数据采集

所有这些井的井码如下:

//启动数据采集按钮

    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;
                                         }
                                     });


    }
private进程()
{
int iAvail=0;
int-iRead=0;
字符串文件名=@textBox3.Text;//从用户处获取csv文件名
//准时制:
//计算值总数并将其存储在iAvail中的函数
int[]iRawData=新的Int32[iAvail];
double[]dScaledData=新的double[iAvail];
//从缓冲区传输数据并将其存储在dscaledData数组中的函数
列表数据=新列表();
for(inti=0;i 
{
while(stopped==false)
{
写入(data.ToArray(),文件名);
//后藤准时制;
}
});
}
//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());
        }
    }
公共静态无效写入(双[]数据,字符串输出路径)
{
StringBuilder sb=新的StringBuilder();
for(int i=0;i
这就是我正在实现的,这段代码的问题是,当数据第一次传输并写入文件时,相同的数据会一次又一次地写入,而不考虑新数据,我尝试实现Goto语句(可以在注释中看到),但它给出了错误-“控件不能离开匿名方法或lambda表达式的主体”,如果我不使用While循环,则数据根本不会被写入

因此,我想调用我的流程函数,从按下开始按钮开始将数据传输到csv,每次都获取新数据并将其写入csv,或者可以说从起点再次调用流程方法并在单击停止按钮时停止,但无论使用不同的循环进行各种尝试,我都无法这样做还提供me线程功能。


请对此提供帮助。

假设您只需要
写入
一次,您应该将其删除或将其从
while
更改为
,如果

while (stopped == false)
循环将导致无限次调用
Write
,直到
停止
变为
true

此外,如果
已停止
,您可能希望将
写入
更改为
返回
,而不是
中断
,这样,如果您应该停止,您就不会写入任何内容:

        if (stopped) break;


如果您想再次生成
数据
,并且确实想永远循环,只需将该代码移动到循环中:

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);
         }
     });
Task myFirstTask=Task.Factory.StartNew()
=> 
{
while(stopped==false)
{
列表数据=新列表();
//TODO:在此处生成数据-将所有相关代码移到此处
写入(data.ToArray(),文件名);
}
});

我认为这是一份适合后台工作人员的工作

此代码将启动您:

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();

    }

}
公共部分类表单1:表单
{
int loopCounter=0;//仅用于说明的变量
private static BackgroundWorker bw=new BackgroundWorker();//worker对象
//此函数完成您的任务
公共无效doSomeStuff(对象发送方,DoWorkEventArgs e)
{
对于(int i=0;i<1000;i++)
{
loopCounter=i;//将循环计数传递给此变量,以便稍后报告工作进程被取消时循环的距离。
Thread.Sleep(100);//减慢循环速度
//在循环检查期间,用户是否要取消
if(bw.取消挂起)
{
e、 取消=真;
return;//退出循环
}
}
}
//按下此按钮可启动任务
私有无效按钮1\u单击(对象发送者,事件参数e)
{
bw.WorkerSupportsCancellation=true;//将工作进程设置为支持取消
bw.DoWork+=doSomeStuff;//初始化事件
if(!bw.IsBusy)//仅当辅助进程尚未运行时才继续启动它。
{
bw.RunWorkerAsync();//启动工作进程
}
}
//按下此按钮可停止您的任务
私有无效按钮2\u单击(对象发送者,事件参数e)
{
//请求取消
CancelAsync();
textBox1.Text=“当'loopCounter'位于:“+loopCounter.ToString()”时,bw被取消;
}
}

这可能是因为
从缓冲区传输数据并将其存储在dscaledData数组中的函数不在循环中。@Dzienny,请给我一些相同的代码,就像我想反复检查缓冲区一样,但是如果数据是冗余的,那么只需保留该数据并在那里停止即可。@Dzienny,请给我分配
数据
一次,因此,如果保留循环,您只需一遍又一遍地编写相同的数据段……请给出一些相同的代码,我有三种不同的命中率和试用率,som
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();

    }

}