gpt4 book ai didi

c# - 方法运行时 Richbox 不更新

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:27 24 4
gpt4 key购买 nike

抱歉标题不合适。我有如下程序

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com