我在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循环但没有运气。任何帮助都会很明显。
答案 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。