- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
抱歉标题不合适。我有如下程序
int status = 100;
richTextBox1.AppendText("Starting Process....." + "\n");
status = comm.WriteData(cmd1);
if (status == 0)
{
richTextBox1.AppendText("COMMAND 1 OK" + "\n");
}
else
{
richTextBox1.AppendText("COMMAND 1 NOT OK" + "\n");
}
richTextBox1.AppendText("Gathering signal from product sensor....." + "\n");
status = comm.WriteData(cmd2);
if (status == 0)
{
richTextBox1.AppendText("COMMAND 2 OK" + "\n");
}
else
{
richTextBox1.AppendText("COMMAND 2 NOT OK" + "\n");
}
richTextBox1.AppendText("Measuring current value" + "\n");
status = comm.WriteData(cmd3);
if (status == 0)
{
richTextBox1.AppendText("COMMAND 3 OK" + "\n");
}
else
{
richTextBox1.AppendText("COMMAND 3 NOT OK" + "\n");
}
这将在按钮单击事件上执行。像这样我需要发送 130 个命令。整个过程大约需要 6 分钟。该代码工作正常。但是直到执行所有命令(6 分钟),RichTextBox
才显示为空。执行每个命令后,我需要向运算符(operator)显示消息,无论命令是否正常。我什至尝试在每个命令之间延迟。但无法实现我需要的。请支持解决此问题。
最佳答案
我会在这里使用 BackgroundWorker
,并使用 ReportProgress
添加到文本框。类似的东西(不在我的脑海中):
public void ButtonClick()
{
// Since your code will now be async, you should need to handle reentrance here
var worker = new BackgroundWorker();
worker.ReportsProgress = true;
worker.ProgressChanged += ProgressLog;
worker.DoWork += TestComm;
worker.RunWorkerAsync();
}
private void ProgressLog(object sender, ProgressChangedEventArgs e)
{
richTextBox1.AppendText(e.UserState.ToString() + Environment.NewLine);
}
private void TestComm(object sender, DoWorkEventArgs e)
{
var worker = sender as BackgroundWorker;
worker.ReportProgress(0, "Starting Process.....");
// Sub-optimal way to construct a string :-)
worker.ReportProgress(0, "COMMAND 1 " + (comm.WriteData(cmd1) == 0 ? "OK" : "NOT OK"));
worker.ReportProgress(0, "Gathering signal from product sensor.....");
worker.ReportProgress(0, "COMMAND 2 " + (comm.WriteData(cmd2) == 0 ? "OK" : "NOT OK"));
worker.ReportProgress(0, "Measuring current value");
worker.ReportProgress(0, "COMMAND 3 " + (comm.WriteData(cmd3) == 0 ? "OK" : "NOT OK"));
// etc.
}
作为旁注,如果您所做的只是“显示标题字符串”、“运行命令”、写“命令 # ok/not ok”,这可以很容易地重构为一个循环,但我会保留它给你:-)
此外,由于您的代码现在是异步的,因此您需要处理按钮的 Click
事件的重入,因为用户现在可以在测试运行时单击按钮(因此会同时运行两个测试,如果您使用的是通信端口,这可能是不可能的)。
这可以像在创建工作人员时禁用按钮一样简单,然后在 BackgroundWorker.RunWorkerCompleted
事件中再次启用它,或者您可以根据需要将其复杂化(取消初始测试并重新启动它,或诸如此类)。
如评论中所述,您还需要有关重新进入的帮助。最简单的方法是这样的:
public void ButtonClick()
{
// Disable the button
myButton.Enabled = false;
var worker = new BackgroundWorker();
worker.ReportsProgress = true;
worker.ProgressChanged += ProgressLog;
worker.DoWork += TestComm;
// Re-enable the button when the worker has completed (or failed)
worker.RunWorkerCompleted += (o,e) => myButton.Enabled = true;
worker.RunWorkerAsync();
}
关于c# - 方法运行时 Richbox 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35498598/
我的 RichBox 中有几个空行,我需要将它们从 Rich 中删除。 我可以细化空白行,但无法删除它们。我该怎么做?我使用了这段代码,但它不起作用: RichTextBox rtfBox = new
抱歉标题不合适。我有如下程序 int status = 100; richTextBox1.AppendText("Starting Process....." + "\n"); status = c
我是一名优秀的程序员,十分优秀!