C# 我的代码需要某种循环或跳转语句
我是C#新手,实现了一个代码,其中我有两个按钮,一个作为数据采集的开始并存储在csv文件中,另一个按钮用于停止数据采集 所有这些井的井码如下: //启动数据采集按钮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
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();
}
}