Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
等待反序列化任务永不结束c#_C#_Json_Asynchronous_Json.net_Task - Fatal编程技术网

等待反序列化任务永不结束c#

等待反序列化任务永不结束c#,c#,json,asynchronous,json.net,task,C#,Json,Asynchronous,Json.net,Task,我试图在我的程序中实现一个Save/Open特性,并且我正在尝试序列化我必须保存的内容,以便在用户需要使用反序列化时能够轻松地加载它。 Newtonsoft是首选的库 问题是文件最终可能非常大,所以必须异步反序列化 我序列化和反序列化的是类验证的对象 这就是我想做的: public async static Task<Validation> CreateFromSaveFile(Validator Outer, string FileName) { Strea

我试图在我的程序中实现一个Save/Open特性,并且我正在尝试序列化我必须保存的内容,以便在用户需要使用反序列化时能够轻松地加载它。 Newtonsoft是首选的库

问题是文件最终可能非常大,所以必须异步反序列化

我序列化和反序列化的是类
验证的对象

这就是我想做的:

public async static Task<Validation> CreateFromSaveFile(Validator Outer, string FileName)
    {
        StreamReader SR = new StreamReader(FileName);
        JsonTextReader JR = new JsonTextReader(SR);
        var Serializer = new JsonSerializer();

        Console.WriteLine("1");

        var task = Task.Factory.StartNew(() => Serializer.Deserialize<Validation>(JR));
        Validation Res = await task;

        Console.WriteLine("2");

        JR.Close();
        SR.Close();

        return Res;
    }
公共异步静态任务CreateFromSaveFile(验证程序外部,字符串文件名)
{
StreamReader SR=新的StreamReader(文件名);
JsonTextReader JR=新的JsonTextReader(SR);
var Serializer=new JsonSerializer();
控制台。写入线(“1”);
var task=task.Factory.StartNew(()=>Serializer.Deserialize(JR));
验证Res=等待任务;
控制台。写入线(“2”);
JR.Close();
高级关闭();
返回Res;
}
现在:1打印,2不打印。它在等待任务时陷入困境。我知道它应该可以工作,因为同步运行相同的代码可以完成它应该做的事情,并且工作得很好。 显然,关于异步/等待编程是如何工作的以及应该如何使用它,我还没有了解一些东西

有人知道吗

编辑:我被要求发布调用此代码的代码。我们开始:

    public async Task<Validation> GetStartingValidation(Menu Outer)
        {
             Validation Res = await Validation.CreateFromSaveFile(this, @"Some\Path.txt").Result;
             Console.WriteLine("Done");
             return Res;
        }
公共异步任务GetStartingValidation(菜单外部)
{
Validation Res=wait Validation.CreateFromSaveFile(这是@“Some\Path.txt”).Result;
控制台。写入线(“完成”);
返回Res;
}
使用async关键字声明的方法同步运行,直到遇到wait。一旦发生这种情况,控件将返回给异步方法的调用方。完成wait关键字前面的调用后,控制权将返回给async方法


在您的情况下,这意味着在反序列化完成之前不会打印“2”。

调用此代码的代码是什么?请使用
Task.Run
而不是
Task.Factory.StartNew
,除非您被迫使用.NET 4.0。此外,您可以在同一句话中等待任务,这不是真正的异步代码,因为您只需旋转另一个在IO上被阻塞的线程。最好找到异步等效方法来执行您想要的操作(如果可能)。是否使用.Result或.Wait()阻止任何位置?如果是大文件,是否应该使用此方法?嗯,这正是我的意思。任务永远不会结束。同步执行时,2被打印,结果Res被返回。我只是希望这个异步代码也有同样的行为,但事实并非如此。哦,对不起,我认为它确实在反序列化完成后出现。@ManuelVenè您很可能(99%肯定)遇到了死锁,这是由调用您发布的代码的代码引起的。请发布代码和正在运行的项目类型