C# C停止执行,直到事件引发

C# C停止执行,直到事件引发,c#,events,C#,Events,我需要停止程序的执行,直到用户点击一个按钮。我正在做一个离散事件模拟,现在的目标是提供简单的图形来说明情况。当模拟到达一个值得显示的事件时,调用一个绘制情况的方法。我需要的方法是,在用户单击按钮之前不要跳回模拟核心,只有在到达感兴趣的点时才会再次调用该按钮。您可以创建一个方法,该方法将返回一个任务,该任务将在下次单击某个特定按钮时完成,它可以通过使用TaskCompletionSource对象来完成。然后,当单击特定按钮时,您可以等待该任务继续执行您的方法: public static Task

我需要停止程序的执行,直到用户点击一个按钮。我正在做一个离散事件模拟,现在的目标是提供简单的图形来说明情况。当模拟到达一个值得显示的事件时,调用一个绘制情况的方法。我需要的方法是,在用户单击按钮之前不要跳回模拟核心,只有在到达感兴趣的点时才会再次调用该按钮。

您可以创建一个方法,该方法将返回一个任务,该任务将在下次单击某个特定按钮时完成,它可以通过使用TaskCompletionSource对象来完成。然后,当单击特定按钮时,您可以等待该任务继续执行您的方法:

public static Task WhenClicked(this Button button)
{
    var tcs = new TaskCompletionSource<bool>();
    EventHandler handler = null;
    handler = (s, args) =>
    {
        tcs.TrySetResult(true);
        button.Click -= handler;
    };
    button.Click += handler;
    return tcs.Task;
}

您可以创建一个方法,该方法将返回下一次单击特定按钮时将完成的任务,它可以通过使用TaskCompletionSource对象来完成该任务。然后,当单击特定按钮时,您可以等待该任务继续执行您的方法:

public static Task WhenClicked(this Button button)
{
    var tcs = new TaskCompletionSource<bool>();
    EventHandler handler = null;
    handler = (s, args) =>
    {
        tcs.TrySetResult(true);
        button.Click -= handler;
    };
    button.Click += handler;
    return tcs.Task;
}

这不是问题。请展示您尝试过的内容以及您遇到的问题。我们不是来为你写程序的。我不确定我是否理解。“如何在事件发生之前停止执行”的哪一部分不是问题?我能想到的解决办法是像whilebuttonnotclicked{}这样的东西,它浪费cpu时间,什么也不做。也许它只是说得不好,但在我第一次阅读时,我看到一个巨大的文本块,它描述了你想做什么。您还可以从停止执行程序开始,这不是您对程序所做的操作。您可能会阻止线程,但停止执行意味着即使单击按钮也不会得到响应。总的来说,没有一个明确的问题,整个事情很难理解,令人困惑,并且显示出缺乏努力和基本理解。Servy给了你一个很好的答案,但这仍然是一个很糟糕的问题。你认为你的/任何程序在事件发生之前除了等待之外,还能做什么?@TaW通常它们什么都不做。它们在连接处理程序之后继续执行,而不等待任何操作。如果您在这方面没有经验,那么尝试等待异步事件的发生实际上是非常重要的。当然,OP实际上并不想等待,因为这会阻塞他的UI,阻止按钮被点击,无限期冻结整个程序。这不是问题。请展示您尝试过的内容以及您遇到的问题。我们不是来为你写程序的。我不确定我是否理解。“如何在事件发生之前停止执行”的哪一部分不是问题?我能想到的解决办法是像whilebuttonnotclicked{}这样的东西,它浪费cpu时间,什么也不做。也许它只是说得不好,但在我第一次阅读时,我看到一个巨大的文本块,它描述了你想做什么。您还可以从停止执行程序开始,这不是您对程序所做的操作。您可能会阻止线程,但停止执行意味着即使单击按钮也不会得到响应。总的来说,没有一个明确的问题,整个事情很难理解,令人困惑,并且显示出缺乏努力和基本理解。Servy给了你一个很好的答案,但这仍然是一个很糟糕的问题。你认为你的/任何程序在事件发生之前除了等待之外,还能做什么?@TaW通常它们什么都不做。它们在连接处理程序之后继续执行,而不等待任何操作。如果您在这方面没有经验,那么尝试等待异步事件的发生实际上是非常重要的。当然,OP实际上并不想等待,因为这会阻塞他的UI,阻止按钮被点击,无限期冻结整个程序。谢谢。你能告诉我把定义放在哪里吗?我试图将它放在Form类下,但这会产生错误。@MathN00b将它放在项目中的静态顶级类中。必须将包含Wait的方法更改为async才能工作。非常感谢你!谢谢你能告诉我把定义放在哪里吗?我试图将它放在Form类下,但这会产生错误。@MathN00b将它放在项目中的静态顶级类中。必须将包含Wait的方法更改为async才能工作。非常感谢你!