c# - 如何从其他类的独立线程上运行的方法中获取变量?

标签 c# multithreading winforms datagridview

假设我有 2 个类:Form1.csStep.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 中的文本框或数据 GridView 行上立即更新变量状态?

谢谢。

最佳答案

您不能从其他线程访问在 UI 线程上创建的控件。您必须使用 InvokeBeginInvoke 来更改 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;
    }));    
}

关于c# - 如何从其他类的独立线程上运行的方法中获取变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36563580/

相关文章:

c# - 表中连续插入数据

java - 防止发送者 channel 的执行,直到从分离器生成的执行器 channel 完成 Spring Integration 中的处理

java - 当另一个线程正在使用映射时,重新分配对映射的引用会引发异常吗?

c# - Windows 窗体中是否有内置确认对话框?

c# .NET - 标签页边距

c# - 使用 Dapper 的 SQLite。分析列时出错。无法将 System.Int64 类型的对象转换为 System.Double 类型

c# - 如何显式更改 ADO.Net DataRow 的 RowState?

c# - 在 C# 控制台应用程序中实现的 gRPC 中收到的客户端证书为空

iphone - initWithContentsOfURL会在NSOperation子类中泄漏内存。还有其他人看到吗?

c# - 如何使用 C# 禁用 Windows 文本框上的右键单击上下文菜单?