我的任务不是等待完成

时间:2017-08-02 01:49:39

标签: c# asynchronous

感谢所有的回复,我真的很感激并且学到了很多东西!我还了解到我有很多需要学习的东西,而且还会出版。

我仍然试图摆脱等待和异步,所以我一直在搞乱,但我现在很难过。我做了大量的谷歌搜索,阅读和研究,但我找不到问题。

所以我正在做的是反序列化并尝试返回一个对象

    public static async Task<SomeObject> Deserialize(string filePath)
    {
        var task = Task.Factory.StartNew(() => LoadFile(filePath));

        await task;

        return task.Result;
    }

然后在这里调用上面的方法:

public async Task DoStuff()
    {
        var load = await Helper.Deserialize(Helper.filePath);

        try
        {
            Console.WriteLine(load.GetType());
        }
        catch(Exception e)
        {
            Console.WriteLine(e);
        }
    }

其余代码在任务完成之前运行,并且对象总是以null形式出现,使其无效。我知道我做错了什么但是我不能,在我的生活中,即使在花了几个小时阅读已回答的问题和微软文档之后,我也不知道它是什么。

@Fabio这是LoadFile方法:

        private static SomeObject LoadFile(string path)
    {
        JsonSerializer json = new JsonSerializer();
        JsonTextReader reader = new JsonTextReader(new StreamReader(path));

        var obj = json.Deserialize(reader, typeof(SomeObject));
        reader.Close();

        return (SomeObject)obj;
    }

2 个答案:

答案 0 :(得分:2)

试试这个

public static Task<SomeObject> Deserialize(string filePath)
    {
        var task = Task.Run(() => LoadFile(filePath));

        return task;       
    }

答案 1 :(得分:1)

您应该使用Task.Run代替Task.Factory.StartNew

public static Task<SomeObject> DeserializeAsync(string filePath)
{
   return Task.Run(() => LoadFile(filePath));
}

假设LoadFile返回SomeObject

或者您可以重构LoadFile方法

private static Task<SomeObject> LoadFileAsync(string path) {
    return Task.Run(() => {
        JsonSerializer json = new JsonSerializer();
        using(var reader = new JsonTextReader(new StreamReader(path))) {
            var obj = json.Deserialize(reader, typeof(SomeObject));
            return (SomeObject)obj;
        }
    });        
}

public static async Task<SomeObject> DeserializeAsync(string filePath)
{
   var obj = await LoadFileAsync(filePath);
   return obj;
}