C# 在不等待任务完成的情况下继续
我有一个从API检索数据的函数(如下)。如果我在反序列化它的行上设置了一个断点,那么我可以看到它填充了非常好的数据 当我继续时,它进入第二个函数(如下),并抛出一个错误。错误旁边显示“尚未计算”,因此引发异常 当我使用一个小列表时,它工作得很好(我假设它是因为它是一个小数据集) 当我使用C# 在不等待任务完成的情况下继续,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,我有一个从API检索数据的函数(如下)。如果我在反序列化它的行上设置了一个断点,那么我可以看到它填充了非常好的数据 当我继续时,它进入第二个函数(如下),并抛出一个错误。错误旁边显示“尚未计算”,因此引发异常 当我使用一个小列表时,它工作得很好(我假设它是因为它是一个小数据集) 当我使用ContinueWith(等待任务完成)时,这怎么可能 公共静态异步任务GetAllCardsInSet(字符串setName) { setName=WebUtility.UrlEncode(setName);
ContinueWith
(等待任务完成)时,这怎么可能
公共静态异步任务GetAllCardsInSet(字符串setName)
{
setName=WebUtility.UrlEncode(setName);
var correctUri=Path.Combine(ApiConstants.YugiohGetAllCardsInSet,setName);
Console.WriteLine();
使用(var httpClient=new httpClient())
{
var响应=
等待httpClient.GetAsync(correctureURI);
var result=await response.Content.ReadAsStringAsync();
var cardData=JsonConvert.DeserializeObject(结果);
对于(int i=0;i
{
//var cards=wait YugiohRequester.GetAllCardsInSet(_selectedCardSet.Name);
尝试
{
this.mainPage.navigateToYouGioHCardListPage(result.result);
}
捕获(例外e)
{
HelperFunctions.ShowToastNotification(“交易卡应用程序”,“抱歉,我们无法获取此集”);
}
});
}
您在没有等待的同步方法中调用了异步方法。应该这样做:
YugiohRequester.GetAllCardsInSet(_selectedCardSet.Name).ContinueWith((result) =>
{
//var cards = await YugiohRequester.GetAllCardsInSet(_selectedCardSet.Name);
try
{
this.mainPage.NavigateToYugiohCardListPage(result.Result);
}
catch (Exception e)
{
HelperFunctions.ShowToastNotification("Trading Card App", "Sorry, we could not fetch this set");
}
}).Wait();
您在同步方法中调用了一个异步方法,而没有Wait
。应该这样做:
YugiohRequester.GetAllCardsInSet(_selectedCardSet.Name).ContinueWith((result) =>
{
//var cards = await YugiohRequester.GetAllCardsInSet(_selectedCardSet.Name);
try
{
this.mainPage.NavigateToYugiohCardListPage(result.Result);
}
catch (Exception e)
{
HelperFunctions.ShowToastNotification("Trading Card App", "Sorry, we could not fetch this set");
}
}).Wait();
您的GetAllCardsInSet
方法无需更改。
但是这种方法的使用是可以重构的。
方法GetAllCardsInSet
returnTask
,但您并没有观察到此任务的完成情况
您需要检查任务是否成功完成,这是使用wait
关键字的最简单方法。等待任务将取消应用返回值,如果任务在异常情况下完成,则引发异常
用于在GetYugiohCardsAndNavigate
中使用async/await
,将方法签名更改为aynchronous并返回Task
private async Task GetYugiohCardsAndNavigate(string name)
{
try
{
var cardSetData = await YugiohRequester.GetAllCardsInSet(_selectedCardSet.Name);
this.mainPage.NavigateToYugiohCardListPage(cardSetData);
}
catch (Exception e)
{
HelperFunctions.ShowToastNotification("Trading Card App",
"Sorry, we could not fetch this set");
}
}
您的GetAllCardsInSet
方法无需更改。
但是这种方法的使用是可以重构的。
方法GetAllCardsInSet
returnTask
,但您并没有观察到此任务的完成情况
您需要检查任务是否成功完成,这是使用wait
关键字的最简单方法。等待任务将取消应用返回值,如果任务在异常情况下完成,则引发异常
用于在GetYugiohCardsAndNavigate
中使用async/await
,将方法签名更改为aynchronous并返回Task
private async Task GetYugiohCardsAndNavigate(string name)
{
try
{
var cardSetData = await YugiohRequester.GetAllCardsInSet(_selectedCardSet.Name);
this.mainPage.NavigateToYugiohCardListPage(cardSetData);
}
catch (Exception e)
{
HelperFunctions.ShowToastNotification("Trading Card App",
"Sorry, we could not fetch this set");
}
}
如果使用
just waitGetAllCardsInSet
方法避免ContinueWith,会发生什么情况?给我一个空引用异常,请您调查返回wait Task.FromResult(cardData.Data)时会发生什么情况
改为cardData.Data
。您的GetAllCardsSet
正在引发异常。检查ContinueWith块中的IsFaulted
结果
参数,查看GetAllCardsInSet
是否抛出错误exception@magna_nz:永远不要使用ContinueWith
。改为使用wait
方法。如果使用just waitGetAllCardsInSet
方法避免ContinueWith,会发生什么情况?给我一个空引用例外。如果返回wait Task.FromResult(cardData.Data),请调查会发生什么情况
改为cardData.Data
。您的GetAllCardsSet
正在引发异常。检查ContinueWith块中的IsFaulted
结果
参数,查看GetAllCardsInSet
是否抛出错误exception@magna_nz:永远不要使用ContinueWith
。改用wait
。