c# - 使用计时器等待进程完成
问题描述
想象一下有两个按钮调用一个异步函数
int packProcesses=0; //the number of processes we are dealing with
bool busy = false; //are we busy?
int v=10;
private async void button5_Click(object sender, EventArgs e)
{
packProcesses++;
busy = true;
Trace.WriteLine("PROCESSES " + packProcesses + " busy? " + busy);
//Do something
var result = await DelayAndReturnAsync(v);
//finished?
packProcesses--;
if (packProcesses <= 0) busy = false;
Trace.WriteLine("Processes " + packProcesses + " busy? " + busy);
}
private async void button6_Click(object sender, EventArgs e)
{
packProcesses++;
busy = true;
Trace.WriteLine("PROCESSES " + packProcesses + " busy? " + busy);
//Do something
var result = await DelayAndReturnAsync(v);
//finished?
packProcesses--;
if (packProcesses <= 0) busy = false;
Trace.WriteLine("Processes " + packProcesses + " busy? " + busy);
}
异步函数在哪里
async Task<int>DelayAndReturnAsync(int val)
{
await Task.Delay(TimeSpan.FromSeconds(val)).ConfigureAwait(false);
Trace.WriteLine("Time" + DateTime.Now);
return val;
}
我想要另一个按钮来调用这两个按钮。如果我只是将两个单击功能一个接一个地放置,我将同时启动两个过程。
因为我希望一个进程在另一个进程之后启动
private async void button8_Click(object sender, EventArgs e)
{
button5_Click(sender, e);
do
{
await Task.Delay(1000);
} while (busy);
button6_Click(sender, e);
}
这是一个好主意吗?我不想为了做到这一点而堵塞 CPU。有没有更好的方法来等待一个进程完成以启动另一个进程?
解决方案
您可以将您的逻辑从处理程序内部移动到另一个方法:
private async void button1_Click(object sender, EventArgs e)
{
await Process1();
}
private async Task Process1()
{
packProcesses++;
busy = true;
Trace.WriteLine("PROCESSES " + packProcesses + " busy? " + busy);
//Do something
var result = await DelayAndReturnAsync(v);
//finished?
packProcesses--;
if (packProcesses <= 0) busy = false;
Trace.WriteLine("Processes " + packProcesses + " busy? " + busy);
}
private async void button2_Click(object sender, EventArgs e)
{
await Process2();
}
private async Task Process2()
{
packProcesses++;
busy = true;
Trace.WriteLine("PROCESSES " + packProcesses + " busy? " + busy);
//Do something
var result = await DelayAndReturnAsync(v);
//finished?
packProcesses--;
if (packProcesses <= 0) busy = false;
Trace.WriteLine("Processes " + packProcesses + " busy? " + busy);
}
然后你可以等待它们:
private async void button3_Click(object sender, EventArgs e)
{
await Process1();
await Process2();
}
推荐阅读
- r - 如何在 r 中使用带有矩阵结构的 Deriv
- android - 如何在 Android Studio 中运行的 AVD 模拟器中暂停 JavaScript 执行?
- code-signing - SignTool /d info(签名内容的描述)在哪里使用/显示?
- excel - 选择文件夹选择器 VBA 停止并且不继续代码
- c# - 当前上下文中不存在名称“TXTF”
- opencv - OPENCV 中的线路端点检测
- django - 每次都需要运行makemessages吗?
- ruby-on-rails - 如何在分组选择中指定选定元素
- spring-boot - 通过参数对不同 Spring 控制器方法的顺序
- flutter - Flutter 条件渲染列表