【问题标题】:Using a timer to wait for processes to complete使用计时器等待进程完成
【发布时间】:2018-07-11 09:14:23
【问题描述】:

假设有两个按钮调用异步函数

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

我的想法来自this answer

这是个好主意吗?我不想为了做到这一点而阻塞 CPU。 有没有更好的方法来等待一个进程完成来启动另一个进程?

【问题讨论】:

    标签: c# timer async-await


    【解决方案1】:

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

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

    【讨论】:

    • @KansaiRobot 是的,他们先处理await Process1 然后await Process2
    【解决方案2】:

    如果可以的话,我会尽量避免让您的 button6_Clickbutton5_Click 方法返回 void。相反,如果您让他们返回Task,您可以await 他们。

    private async Task button5_Click(object sender, EventArgs e) 
    { ... }
    
    private async Task button8_Click(object sender, EventArgs e) 
    {
         await button5_Click(sender, e);
         await button6_Click(sender, e);
    }
    

    编辑:

    private async Task HandleButton5_Click() 
    {
         ...
    }    
    
    private async void button5_Click(object sender, EventArgs e) 
    {  
        await HandleButton5_Click();
    }
    
    private async void button8_Click(object sender, EventArgs e) 
    {
         button5_Click(sender, e);
         button6_Click(sender, e);
    }
    

    【讨论】:

    • 这是个好主意!我不知道您可以更改单击按钮函数的返回值!我试试看
    • 如果您无法更改按钮单击的返回类型,解决此问题的一种方法可能是在源文件中创建另一个方法,即 async Task,然后从 void 按钮单击中调用它处理程序和await 代替它
    • 我试过了,但它给出了错误。显然你不能改变点击按钮的返回值
    • 是的,我明白了。一个问题,在你编辑的代码中,在button8中,直接用await调用HandleButtonX_Click怎么样?
    • 是的,这也可以工作:) 但是当你点击表单上的button5 我认为它是,按钮不会做任何事情=PI假设你只是使用 button8 来触发两者5 和 6 按钮处理程序
    猜你喜欢
    • 1970-01-01
    • 2010-11-06
    • 2011-11-09
    • 2012-07-27
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多