我有一个问题,我调用了一个异步方法,并且该调用未返回。我认为它是线程的竞赛。我该如何正确写呢?

从这里开始。我首先调用一个称为“ GetCachedValuesAsync”的异步方法

public void OnNavigatingTo(NavigationParameters parameters)
    {
        Task.Run(async () =>
        {
            await GetCachedValuesAsync();
            ClipRefernce = GenerateRefernce(clips);
        });
    }


这是GetCachedValueAsync的方法签名

public async Task  GetCachedValuesAsync()
    {
        try
        {
            clips = await BlobCache.LocalMachine.GetObject<List<Clip>>("clips");
        }
        catch (KeyNotFoundException ex)
        {
            clips = new List<Clip>();
        }
    }


我没有从BlobCache返回调用,BlobCahce方法是称为akavache的库的一部分。

该代码也未命中:ClipRefernce = GenerateRefernce(clips);

我感谢您的帮助

编辑1

这是GenerateRefernce方法。

public string  GenerateRefernce(List<Clip> clips)
    {
        string refernce = "";
        if(clips.Count > 0)
        {
            var clip = clips.LastOrDefault();
            refernce = String.Format("Ref {0:yyyy}/{1}",DateTime.Now , clip.ClipId + 1);
        }
        else{
            refernce = String.Format("Ref {0:yyyy}/{1}", DateTime.Now, 1);
        }
        return refernce;
    }

最佳答案

您需要像这样从Task.Run中删除​​sync方法:

public void OnNavigatingTo(NavigationParameters parameters)
{
    Task.Run(async () =>
    {
        await GetCachedValuesAsync();
    });

    ClipRefernce = GenerateRefernce(clips);
}

public async Task  GetCachedValuesAsync()
{
    try
    {
        clips = await BlobCache.LocalMachine.GetObject<List<Clip>>("clips");
    }
    catch (KeyNotFoundException ex)
    {
        clips = new List<Clip>();
    }
}

09-11 19:23
查看更多