C# 在不等待任务完成的情况下继续

C# 在不等待任务完成的情况下继续,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,我有一个从API检索数据的函数(如下)。如果我在反序列化它的行上设置了一个断点,那么我可以看到它填充了非常好的数据 当我继续时,它进入第二个函数(如下),并抛出一个错误。错误旁边显示“尚未计算”,因此引发异常 当我使用一个小列表时,它工作得很好(我假设它是因为它是一个小数据集) 当我使用ContinueWith(等待任务完成)时,这怎么可能 公共静态异步任务GetAllCardsInSet(字符串setName) { setName=WebUtility.UrlEncode(setName);

我有一个从API检索数据的函数(如下)。如果我在反序列化它的行上设置了一个断点,那么我可以看到它填充了非常好的数据

当我继续时,它进入第二个函数(如下),并抛出一个错误。错误旁边显示“尚未计算”,因此引发异常

当我使用一个小列表时,它工作得很好(我假设它是因为它是一个小数据集)

当我使用
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
return
Task
,但您并没有观察到此
任务的完成情况

您需要检查任务是否成功完成,这是使用
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
return
Task
,但您并没有观察到此
任务的完成情况

您需要检查任务是否成功完成,这是使用
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 wait
GetAllCardsInSet
方法避免
ContinueWith,会发生什么情况?给我一个空引用异常,请您调查返回
wait Task.FromResult(cardData.Data)时会发生什么情况
改为
cardData.Data
。您的
GetAllCardsSet
正在引发异常。检查ContinueWith块中的
IsFaulted
结果
参数,查看
GetAllCardsInSet
是否抛出错误exception@magna_nz:永远不要使用
ContinueWith
。改为使用
wait
方法。如果使用
just wait
GetAllCardsInSet
方法避免
ContinueWith,会发生什么情况?给我一个空引用例外。如果返回
wait Task.FromResult(cardData.Data),请调查会发生什么情况
改为
cardData.Data
。您的
GetAllCardsSet
正在引发异常。检查ContinueWith块中的
IsFaulted
结果
参数,查看
GetAllCardsInSet
是否抛出错误exception@magna_nz:永远不要使用
ContinueWith
。改用
wait