假设我有两个类:Form1.cs
和Step.cs
在类Form
中,我调用类Step
中的一个方法,并将其分配给一个新线程,以避免与UI发生冲突。
Form1.cs
public partial class Form1 : Form
{
Step test_step = new Step();
public void main_run_auto() {
test_step.TakeAction();
}
public void function_1() {
Thread thread_1 = new Thread(() => main_run_auto());
thread_1.start();
}
}
步骤.cs
public class Testing_Steps_class
{
public void TakeAction() {
string status = "";
// Step 1
...do something...
status = "Updated Stt 1";
// Step 2
...do something...
status = "Updated Stt 2";
// Step 3
...do something...
status = "Updated Stt 3";
}
}
我的问题是:如何在类Form1
中的文本框或数据网格视图行上立即更新变量状态?
谢谢。
您不能从其他线程访问在UI
线程上创建的控件。必须使用的Invoke
或BeginInvoke
才能更改UI
。
public void TakeAction() {
// Step 1
...do something...
UpdateUI("Updated Stt 1");
// Step 2
...do something...
UpdateUI("Updated Stt 2");
// Step 3
...do something...
UpdateUI("Updated Stt 3");
}
void UpdateUI(string message)
{
Textbox1.Invoke((MethodInvoker)(() =>
{
textbox1.Text= message;
}));
}
我不确定您想要传输的变量到底是什么,但有一种方法可以做到,因为您有一个Class
Step
的实例,它创建了一个自定义事件来传输您的变量。传输异常的示例:
public class Test1
{
public delegate void HandleErrorGenerated(Exception exc, string method);
public event HandleErrorGenerated ExceptionGenerated;
private void OnExceptionGenerated(Exception exc, string method)
{
if (ExceptionGenerated != null)
{
ExceptionGenerated(exc, method);
}
else
{
throw exc;
}
}
private void MethodInMyThread()
{
try
{
//do stuff
}
catch(Exception e)
{
OnExceptionGenerated(e, "MethodInMyThread");
}
}
}
public class Form1
{
Test1 theTest = new Test1();
public Form1()
{
Test1.ExceptionGenerated += test1_ExceptionGenerated;
}
private void test1_ExceptionGenerated(Exception exc, string method)
{
//handle variable passed
}
}
另一种方法是将具有ref
的变量从Form
传递到Step
类,并在step类方法内部更新其值。MSDN示例
然后使用调用方法,正如Hari Prasad所说。