C# 在C中使用线程使函数等待按钮单击#

C# 在C中使用线程使函数等待按钮单击#,c#,multithreading,function,C#,Multithreading,Function,我在代码中处理线程时遇到问题。我想让一个函数等待,直到它自己表单中的按钮被点击。 一个简单的场景如下所示。这只是我真正问题的概述。假设从另一个类调用myFunction(),并使用其返回值 public class myForm: Form { int x=0; public dialogForm() { InitializeComponent(); } public int myFunction() { //do someth

我在代码中处理线程时遇到问题。我想让一个函数等待,直到它自己表单中的按钮被点击。 一个简单的场景如下所示。这只是我真正问题的概述。假设从另一个类调用myFunction(),并使用其返回值

public class myForm: Form
{   int x=0;
    public dialogForm()
    {
        InitializeComponent();
    }
    public int myFunction() {
        //do something
        //wait for button1's click
        return x;
    } 
  private void button1_Click(object sender, EventArgs e)
    {
       // using this button to change the value of x
       x=2;
    }

提前谢谢。希望有人能帮忙

在这种情况下,您可以使用AutoResteEvent。下面是更新的示例代码

public class myForm: Form
{   
    int x=0;
    AutoResetEvent auto;
    public myForm()
    {
        auto = new AutoResetEvent(false);
        InitializeComponent();
    }
    public int myFunction() {
        //do something
        //wait for button1's click
        auto.WaitOne();
        return x;
    } 
  private void button1_Click(object sender, EventArgs e)
    {
       // using this button to change the value of x
      x=2;
      auto.Set();
    }
}

从本质上讲,UI控件告诉您用户何时通过从不同线程调用的eventsIs myFunction与它们交互?如果在调用myFunction之前随时按下按钮,或者希望函数等待下一次按下按钮,这又有什么关系呢?一般来说,这不是一个好主意,如果将线程代码分为两部分,让按钮启动一个线程来执行第二部分,情况会好得多。使通过线程竞争问题进行推理变得更加容易。包括用户在线程仍在运行时关闭窗口时必须解决但尚未考虑的问题。@NineBerry不,只有主线程。我知道这在单个线程上是不可能的。所以我需要一些帮助。谢谢你的回答。我尝试了上面的代码,但问题仍然存在。上述方法会导致主线程停止,所有内容都停止。我想在主线程以外的新线程中执行此操作。实际情况是,从主线程处理的另一个表单调用此表单。但是在主线程的新线程中显示表单似乎很棘手,我不知道确切的方法。我很高兴听到解决方案。因此,我认为您可以使用C#中的事件,而不是阻止函数调用。下面是显示表单之间事件的示例代码。使用事件将form2中的字符串值传递给form1。这不会冻结UI。您可以在多个表单中使用相同的逻辑。查看这是否有帮助。公共委托无效ClickEventHandler(字符串值);公共部分类Form1:Form{private ClickEventHandler clickHandler;public Form1(){clickHandler+=Form2ClickHandler;}private void button1_-Click(对象发送方,事件参数e){Form2 frm2=new Form2(clickHandler);frm2.Show();}private void Form2ClickHandler(字符串值){textBox1.Text=value;}}}public分部类Form2:Form{private ClickEventHandler clickHandler;public Form2(ClickEventHandler){clickHandler=handler;InitializeComponent();}private void button1_Click(object sender,EventArgs e){clickHandler(textBox1.Text);}}非常感谢您的建议。看来我不应该弄乱主UI线程。因此,这个解决方案似乎是一个更好的解决方案。