c#async等待函数调用未按预期工作

时间:2018-03-15 18:04:24

标签: c#

我在c#winform应用程序中工作。

我在按钮点击事件中有这个动作代码:

    private int liveRATE = 0;
    private async void GetLiveRate()
    {                        
        var productResponseInitialStep = await productClient.GetProductTickerAsync(Currency);
        if (productResponseInitialStep.StatusCode == HttpStatusCode.OK)
        {                
            liveRATE = 100;
        }

        if (liveRATE > 0)
            SendInitialPO(liveRATE);        
    }

哪个正常运作。和SendInitialPO正在工作。

现在我试图将几行推到一个函数中,这样我就可以重复使用它,而无需一次又一次地写几行。但它没有像我预期的那样工作,代码永远不会触及SendInitialPO(liveRATE);.

    private int liveRATE = 0;
    private async void GetLiveRate()
    {                                   
        GetLiveRate2(); 
        if (liveRATE > 0)
            SendInitialPO(liveRATE);        
    }       

    private async void GetLiveRate2()
    {            
        var productResponseInitialStep = await productClient.GetProductTickerAsync(Currency);                
        if (productResponseInitialStep.StatusCode == HttpStatusCode.OK)
        {
            liveRATE = 100;
        }            
    }

我正在阅读有关aync和await如何工作的内容。但不知道如何解决我的问题。我试图添加do while循环但没有运气。任何帮助都会很明显。

1 个答案:

答案 0 :(得分:1)

试试这个:

private int liveRATE = 0;
private async Task GetLiveRate()
{                                   
    await GetLiveRateAsync(); 
    if (liveRATE > 0)
        SendInitialPO(liveRATE);        
}       

private async Task GetLiveRateAsync()
{            
    var productResponseInitialStep = await productClient.GetProductTickerAsync(Currency);                
    if (productResponseInitialStep.StatusCode == HttpStatusCode.OK)
    {
        liveRATE = 100;
    }            
}

通过一些最佳实践,我建议遵循以下代码块: (参见返回类型和变量声明的细微变化)

private async Task GetLiveRate()
{                                   
    var liveRATE = await GetLiveRateAsync(); 
    if (liveRATE > 0)
        SendInitialPO(liveRATE);        
}       

private async Task<int> GetLiveRateAsync()
{            
    var productResponseInitialStep = await productClient.GetProductTickerAsync(Currency);                
    if (productResponseInitialStep.StatusCode == HttpStatusCode.OK)
      return 100;

    return 0            
}

无论如何,主要的内容是:async void仅适用于事件处理程序。您应该返回Task并在需要时致电await

有关详细信息,请参阅documentation

  

异步方法可以具有以下返回类型:

     
      
  • Task
  •   
  • Task<TResult>
  •   
  • void,只应用于事件处理程序。
  •   
  • 从C#7开始,任何具有可访问GetAwaiter方法的类型。 System.Threading.Tasks.ValueTask<TResult>类型是一个   这样的实施。可以通过添加NuGet包来实现   System.Threading.Tasks.Extensions。
  •