c# 异步等待按钮单击

标签 c# button foreach async-await

<分区>

我是 c# 异步等待机制的新手。我已经检查了所有之前的 async, await 示例,但没有一个与我的完全相同。我想做什么?我有一个 foreach 循环,我想按特定规则停止它,做一些事情并通过单击按钮继续运行。 这是一个简单的代码示例:

private void RunConvert()  // START 
{
    foreach (PartSettings File in PartsFromXLS)  // RUNING THE FOREACH LOOP ON A LIST
    {
        ProcessSinglePart(PathStep, PathMCX);
    }
}

public static async void ProcessSinglePart(string PartPathToRead, string PartPathToSave)
{
    // DO SOME STUFF BEFORE THE CHECK

    if (PartLength < PartWidth) // SOME CHECK VALUES
    {
         await WhenClicked();  //HERE I WOULD LIKE TO WAIT FOR BUTTON CLICK
    }

    //DO SOME STUFF AFTER THE CHECK
}

private void GeometryOK_Click(object sender, EventArgs e) 
{
    //  I WOULD LIKE TO WAIT FOR THIS CLICK
}

最佳答案

await暂停方法的执行,直到参数(必须是 Task,实际上,它只是一个 TaskTask<T>)完成。您的问题实际上是我遇到过很多次的问题:

How to asynchronously wait for some event to be fired

在您的情况下,“某些事件”是单击按钮。幸运的是,TaskCompletionSource<T> (以下简称 TCS)非常适合解决这个问题。首先在类级别声明一个 TCS:

private TaskCompletionSource<bool> clickWaitTask;

没有非通用版本的 TCS,所以我通常只使用 bool .在这种情况下,我们实际上并不关心数据。然后你的方法看起来像这样(后面的解释):

public static async void ProcessSinglePart(string PartPathToRead, string PartPathToSave)
{
    // DO SOME STUFF BEFORE THE CHECK
    clickWaitTask = new TaskCompletionSource<bool>();

    if (PartLength < PartWidth) // SOME CHECK VALUES
    {
         await clickWaitTask.Task;
    }

    //DO SOME STUFF AFTER THE CHECK
}

您创建一个新的 TCS,以便每次运行此逻辑时,它都会等待点击发生。然后你等待 Task属性(实际上是 Task<T> )。该任务只会在 TrySetResult 时完成在 TCS 对象上调用。在您的按钮单击处理程序(或 WPF 的命令处理程序)中执行此操作:

 clickWaitTask.TrySetResult(true); //Value does not matter

正如一位评论者所说,您不应该使用 async void除非你在事件处理程序中,并且应该有 try/catch在这种情况下围绕该方法避免一些未处理的异常的麻烦。我也非常警惕你的public static但这是一个单独的问题。

关于c# 异步等待按钮单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52706251/

相关文章:

javascript - 播放下一个/上一个按钮问题?

ios - 如何在 Swift 中循环访问 UITableView 中的数据

c# - 列表的 XML 序列化变得太大

c# - RayCastHit 找不到错误消息 *Unity*

c# - Linq to SQL 编写可翻译函数

java - 设置动画反向移动并在单击按钮时显示类中的形状

css - 重置/标准化 <button> 使其像 <a> 一样

c# - 在 C# 中,什么时候引用类型比值类型更有效?

Java:从一个字符串值替换多个字符串模式

javascript - 我在 forEach 中更新的变量返回到它们的原始值