C# 后台工作者未完成
C# Background worker not completing
我的后台工作人员没有完成并随后在 运行 之后挂起。后台工作人员处理 运行 线性阶段的程序,因此时机正确很重要(因此所有 Thread.Sleep()
调用。)
这是我的代码:
public MainForm()
{
InitializeComponent();
bgW2.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgW2_RunWorkerCompleted);
}
private void bgW2_DoWork(object sender, DoWorkEventArgs e)
{
string program = @"C:\Users\mikegjohn\source\repos\CLL AutoForce\Test.csv";
var stream = new FileStream(program, FileMode.Open, FileAccess.Read);
using (var streamReader = new StreamReader(stream))
{
string ln;
while ((ln = streamReader.ReadLine()) != null)
{
string[] lnArr = ln.Split(',');
switch (lnArr[1])
{
case "0":
sendCommand("L-");
string status = "";
while (status != "0")
{
Thread.Sleep(250);
status = loopCommands("PS");
}
Thread.Sleep(1000);
break;
case "1":
string p = Fn.convertPos(lnArr[3]);
sendCommand("X"+p);
string s = Convert.ToString(Fn.backconvert(loopCommands("PX")));
while (s != lnArr[3])
{
Thread.Sleep(250);
s = Convert.ToString(Fn.backconvert(loopCommands("PX")));
}
Thread.Sleep(1000);
break;
case "2":
Fn.MeasureLabel();
break;
case "3":
sendCommand("HSPD=500000");
Thread.Sleep(500);
sendCommand("LSPD=250000");
Thread.Sleep(500);
sendCommand("X0");
string x = Convert.ToString(Fn.backconvert(loopCommands("PX")));
while (x != lnArr[4])
{
Thread.Sleep(250);
s = Convert.ToString(Fn.backconvert(loopCommands("PX")));
}
Thread.Sleep(1000);
sendCommand("HSPD=250000");
sendCommand("LSPD=50000");
break;
}
}
}
}
private void btnRun_Click(object sender, EventArgs e)
{
bgW2.RunWorkerAsync();
}
private void bgW2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Program completed");
}
Messagebox.Show
永远不会触发。我已经查看了其他一些类似的问题,这些问题主要指向 UI 线程的阻塞。谁能用这个指出我正确的方向?
您可能错过了 DoWork 事件。
public Form1() {
InitializeComponent();
bgW2.DoWork += new DoWorkEventHandler(bgW2_DoWork) ;
bgW2.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgW2_RunWorkerCompleted);
}
发现了我的问题 - 这是 case "3"
中的一个错误,我没有注意到
case "3":
sendCommand("HSPD=500000");
Thread.Sleep(500);
sendCommand("LSPD=250000");
Thread.Sleep(500);
sendCommand("X0");
string x = Convert.ToString(Fn.backconvert(loopCommands("PX")));
while (x != lnArr[4])
{
Thread.Sleep(250);
s = Convert.ToString(Fn.backconvert(loopCommands("PX"))); // <-- this does not match the while so it was getting stuck in the loop
}
Thread.Sleep(1000);
sendCommand("HSPD=250000");
sendCommand("LSPD=50000");
break;
我的后台工作人员没有完成并随后在 运行 之后挂起。后台工作人员处理 运行 线性阶段的程序,因此时机正确很重要(因此所有 Thread.Sleep()
调用。)
这是我的代码:
public MainForm()
{
InitializeComponent();
bgW2.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgW2_RunWorkerCompleted);
}
private void bgW2_DoWork(object sender, DoWorkEventArgs e)
{
string program = @"C:\Users\mikegjohn\source\repos\CLL AutoForce\Test.csv";
var stream = new FileStream(program, FileMode.Open, FileAccess.Read);
using (var streamReader = new StreamReader(stream))
{
string ln;
while ((ln = streamReader.ReadLine()) != null)
{
string[] lnArr = ln.Split(',');
switch (lnArr[1])
{
case "0":
sendCommand("L-");
string status = "";
while (status != "0")
{
Thread.Sleep(250);
status = loopCommands("PS");
}
Thread.Sleep(1000);
break;
case "1":
string p = Fn.convertPos(lnArr[3]);
sendCommand("X"+p);
string s = Convert.ToString(Fn.backconvert(loopCommands("PX")));
while (s != lnArr[3])
{
Thread.Sleep(250);
s = Convert.ToString(Fn.backconvert(loopCommands("PX")));
}
Thread.Sleep(1000);
break;
case "2":
Fn.MeasureLabel();
break;
case "3":
sendCommand("HSPD=500000");
Thread.Sleep(500);
sendCommand("LSPD=250000");
Thread.Sleep(500);
sendCommand("X0");
string x = Convert.ToString(Fn.backconvert(loopCommands("PX")));
while (x != lnArr[4])
{
Thread.Sleep(250);
s = Convert.ToString(Fn.backconvert(loopCommands("PX")));
}
Thread.Sleep(1000);
sendCommand("HSPD=250000");
sendCommand("LSPD=50000");
break;
}
}
}
}
private void btnRun_Click(object sender, EventArgs e)
{
bgW2.RunWorkerAsync();
}
private void bgW2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Program completed");
}
Messagebox.Show
永远不会触发。我已经查看了其他一些类似的问题,这些问题主要指向 UI 线程的阻塞。谁能用这个指出我正确的方向?
您可能错过了 DoWork 事件。
public Form1() {
InitializeComponent();
bgW2.DoWork += new DoWorkEventHandler(bgW2_DoWork) ;
bgW2.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgW2_RunWorkerCompleted);
}
发现了我的问题 - 这是 case "3"
中的一个错误,我没有注意到
case "3":
sendCommand("HSPD=500000");
Thread.Sleep(500);
sendCommand("LSPD=250000");
Thread.Sleep(500);
sendCommand("X0");
string x = Convert.ToString(Fn.backconvert(loopCommands("PX")));
while (x != lnArr[4])
{
Thread.Sleep(250);
s = Convert.ToString(Fn.backconvert(loopCommands("PX"))); // <-- this does not match the while so it was getting stuck in the loop
}
Thread.Sleep(1000);
sendCommand("HSPD=250000");
sendCommand("LSPD=50000");
break;