首页 > 解决方案 > 使用计时器等待进程完成

问题描述

想象一下有两个按钮调用一个异步函数

  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。有没有更好的方法来等待一个进程完成以启动另一个进程?

标签: c#timerasync-await

解决方案


您可以将您的逻辑从处理程序内部移动到另一个方法:

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();
}

推荐阅读