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



假设我有两个类: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中的文本框或数据网格视图行上立即更新变量状态?

谢谢。

您不能从其他线程访问在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;
    }));    
}

我不确定您想要传输的变量到底是什么,但有一种方法可以做到,因为您有一个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所说。

最新更新