异步反序列化调用在C#中不起作用



我正在使用Newtonsoft.Json读取Json文件。我正试图对json文件进行aysnc调用以读取其数据,但不幸的是,它没有返回任何内容。我尝试过不使用异步,它运行得很好,下面是我的代码:

public static async Task<T> LoadAsync<T>(string filePath)
{
        // filePath: any json file present locally on the disk
        string basePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace("file:\", "");
        string fullPath = Path.Combine(basePath, filePath);
        using (var stream = File.OpenRead(fullPath))
        {
            var reader = new StreamReader(stream, Encoding.GetEncoding("iso-8859-1"));
            var task = Task.Factory.StartNew(() => JsonConvert.DeserializeObject<T>(reader.ReadToEnd()));
            var value = await task;
            return value;
        }
}

我试着调试,但调试器在上面的方法中没有"返回值",我通过以下函数调用上面的方法:

private void GetDataFromJson()
{
        var value = JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE);
}

问题出在哪里?文件在我的计算机上本地存在。

我正在尝试对json文件进行aysnc调用,以读取其数据

你真的想异步生成代码吗?JsonUtilities类是否提供LoadAsync()方法的同步版本?

您的方法是同步的:

private void GetDataFromJson()
{
        var value = JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE);
}

它只做一件事:它调用LoadAsync()。它确实将该方法的返回值存储在value中,但您永远不会使用value。所以它被忽略了。LoadAsync()的返回值不是TaxOffice对象。它是一个Task,代表LoadAsync()正在做的工作。在完成该任务之前,无法获得值。但是GetDataFromJson()并不等待任务完成。因此,如果调用者希望在方法返回时完成,那么它会非常失望。

如何最好地修复您的代码尚不清楚,因为您还没有提供一个好的最小完整代码示例来显示您需要帮助的内容。但有两种明显的策略可以遵循:

使方法异步:

private async Task GetDataFromJson()
{
        var value = await JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE);
        // presumably you do something with "value" here?
}

这是最好的方法。但这需要调用者能够正确地处理异步调用。它可能也需要转化为async方法。以及它的呼叫者。依此类推,直到到达调用堆栈的顶部(例如,事件处理程序方法)。

在整个调用堆栈中切换到async有点痛苦,但如果你这样做,代码会工作得更好。你的线程(可能是UI线程)不会在等待操作时卡住,你也可以正确地处理其他异步操作。

忽略LoadAsync()方法的异步特性:

private void GetDataFromJson()
{
        var value = JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE).Result;
        // presumably you do something with "value" here?
}

这是不太好™方法它有效。但是它会阻塞当前线程,直到异步操作完成,从而否定了异步操作的全部好处。

相关内容

  • 没有找到相关文章

最新更新