c# - 计算异步按钮被按下的次数(或者是否正在进行某些操作)
问题描述
我知道对于异步操作,可以跟踪其进度,但我稍后会尝试。现在我有一个简单的窗口窗体应用一个按钮(或一对按钮 - 数字无关紧要)。按钮调用异步操作
public async void Button1_Click(...)
{
await Button1_OperationAsync(...);
}
如果我不按下按钮,什么都不会发生,但如果我在Button1_OperationAsync
启动时按下它(并且正在等待)。(我不确定是否称其为“线程”)。
但是如果我按两次按钮会发生什么?那么在第一个异步操作完成之前,Button1_OperationAsync
再次调用了。(或者如果按下另一个类似的按钮,则Button2_OperationAsync
调用 a)
甚至可能第二个异步操作会在第一个异步操作之前完成。
我想要的是一种简单的方法来了解是否正在进行任何操作。所以我的想法是有一个变量并在调用操作时增加它,并在操作完成时减少它。就像是
int numberOfOps=0;
public async void Button1_Click(...)
{ numberOfOps++;
textBox1.Text="Started!";
await Button1_OpeationAsync(...);
numberOfOps--;
if(numberOfOps<=0)
{
textBox1.Text="Done!";
}
}
请注意,此代码也将进入另一个按钮 (Button2)。或许多其他按钮。
我知道可能涉及同步问题。因此,我将不胜感激有关我正在尝试做的事情的建议,以便正确地做
解决方案
使用async
/await
时,除了 UI 线程之外,您没有为 UI 代码使用任何线程。在Button1_OpeationAsync
方法中调用的代码可能使用单独的线程,但调用代码将保留在 UI 线程上。
尝试使用以下代码:
private int numberOfOps = 0;
private async void button1_Click(object sender, EventArgs e)
{
textBox1.Text = $"Started! {++numberOfOps}";
await Task.Delay(TimeSpan.FromSeconds(5.0));
textBox1.Text = $"Started! {--numberOfOps}";
if (numberOfOps == 0)
{
textBox1.Text = "Done!";
}
}
它工作得很好。您可以numberOfOps
跨多个按钮使用该变量。
如果您想让重用代码变得容易,请尝试以下方式:
int numberOfOps = 0;
private async Task RunOp(Func<Task> op)
{
textBox1.Text = $"Started! {++numberOfOps}";
await op();
textBox1.Text = $"Started! {--numberOfOps}";
if (numberOfOps == 0)
{
textBox1.Text = "Done!";
}
}
private async void button1_Click(object sender, EventArgs e)
{
await this.RunOp(() => Button1_OpeationAsync(...));
}
private async void button2_Click(object sender, EventArgs e)
{
await this.RunOp(() => Button2_OpeationAsync(...));
}
推荐阅读
- python - Selenium Python3 Bruteforce Login 带有 2 个单独的文本文件。错误
- javascript - Vue 方法列出对象数组中的每个对象会导致错误
- javascript - 在生产中刷新页面后 Tailwind 类不起作用
- google-api - Google Place API 指定状态
- python - 如何在pygame中直线移动对象?
- reactjs - 敏锐滑块反应js额外点显示问题
- python - AttributeError:“公会”对象没有属性“消息”
- python - 如何在 python 列表中每个 URL 的开头/结尾添加引号?
- c - 如何从使用 NtCreateUserProcess 创建的进程中隐藏窗口?
- python - 处理从 shell 脚本到 python 内部参数的文件