暂停并恢复线程c#

时间:2018-01-25 21:19:32

标签: c#

我试图在我的函数中暂停一个线程,然后在单击一个按钮时将恢复该线程。 Windows表单应用程序

    private readonly AutoResetEvent mre = new AutoResetEvent(false);
    public void InstINP( int IntAcc)
    {
        BtnInp.Enabled = true; //enable text box
        MessageBox.Show("Please input a value");

        mre.WaitOne();
    }

    void BtnInp_Click(object sender, EventArgs e)
    {
        LblACC.Text = TxtInput.Text; //print to accumulator label
        BtnInp.Enabled = false; //disable button

        mre.Set();
    }

这就是我的代码。我想暂停它说mre.WaitOne();并恢复它所说的mre.Set()。 但是,当此代码运行时,我无法按下程序上的任何按钮或与程序交互,这意味着我无法恢复该程序。

1 个答案:

答案 0 :(得分:1)

你是对的。

  • mre.WaitOne()会暂停该帖子。
  • mre.Set()确实恢复了帖子。

您可能已经知道的其他事实:

  • 暂停的主题没有进行任何处理。

你没想到的事情:

  • 您正在暂停处理按钮点击的主题。

如果你想暂停一些逻辑,而不是整个线程,你可以使用C#任务:

  • 创建一个TaskCompletionSource,比如tcs = new TaskCompletionSource<bool>()
  • 暂停await tcs.Task;
  • 使用tcs.SetResult(true);
  • 继续

使用await将暂停正在进行的操作并返回处理其他事件,例如按钮点击。

这种方式的工作原理是C#编译器会自动将代码拆分为多个函数调用,因此第一个可以返回到消息调度循环,剩下的代码可以在任务完成后调用。 await关键字标记编译器将执行此拆分的位置。

重要提示:TaskCompletionSource无法像AutoResetEvent那样重置和重复使用。您必须为每个暂停/恢复周期构建一个新的。