异步反序列化调用无法在C#中工作

时间:2015-12-02 13:26:37

标签: c# json json.net file-read

我正在使用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;
        }
}

我尝试调试但调试器没有启动&#34;返回值&#34;在上面的方法中我通过以下函数调用上面的方法:

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

可能是什么问题?文件存在于我的计算机本地。

1 个答案:

答案 0 :(得分:2)

  

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

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

您的方法是同步的:

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

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

如何最好地修复代码尚不清楚,因为您没有提供a good, minimal, complete code example来展示您需要帮助的内容。但是你可以遵循两种明显的策略:

使方法异步:

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?
}

这是Not Very Good™方法。有用。但它会阻止你的当前线程,直到完成异步操作,否定了首先进行异步操作的全部好处。