0

考虑这段代码:

    private static void Main(string[] args)
    {
        var person = new Person { Manager = new Manager { Name = "Shahrooz" }, Name = "Sina" };
        Console.WriteLine("I am {0} my manager is {1}", person.Name, person.Manager.Name);
        //Outpu:I am Sina my manager is Shahrooz
        var newManager = person.Manager;
        person.Manager = null;

        new Thread(() => File.WriteAllText( Path.Combine("C:\\", string.Format("{0}.txt", person.Name)), new JavaScriptSerializer().Serialize(person))).Start();
        Console.WriteLine("I am {0} my manager is", person.Name);
        person.Manager = newManager;
        Console.ReadLine();
    }
}

public class Person
{
    public string Name { get; set; }
    public Manager Manager { get; set; }
}

public class Manager
{
    public string Name { get; set; }
}

我正在尝试使用JavaScriptSerializer. 在序列化之前,我将 person's manager 设置为 null 但我在文本文件中得到了很好的结果:

{"姓名":"新浪","经理":{"姓名":"Shahrooz"}}

我混淆了。请帮我。

更新:

我更改了我的代码。没关系:

  internal class Program
    {
        private static  void Main(string[] args)
        {
            var person = new Person { Manager = new Manager { Name = "Shahrooz" }, Name = "Sina" };
            Console.WriteLine("I am {0} my manager is {1}", person.Name, person.Manager.Name);
            //Outpu:I am Sina my manager is Shahrooz
            var x = person.Manager;
            person.Manager = null;
            add(person);
            Console.WriteLine("I am {0} my manager is", person.Name);
            person.Manager = x;
            Console.ReadLine();
        }

        public static async void add(Person person)
        {
            await AddToFile(person);

        }

        private async static Task AddToFile(Person person)
        {
            File.WriteAllText(Path.Combine("C:\\", string.Format("{0}.txt", person.Name)), new JavaScriptSerializer().Serialize(person));
        }
    }

    public class Person
    {
        public string Name { get; set; }
        public Manager Manager { get; set; }
    }

    public class Manager
    {
        public string Name { get; set; }
    }
4

2 回答 2

6

问题是您创建的用于序列化对象的线程与主线程竞争。有时它会在主线程重置 Manager 引用之前序列化对象,有时在之后。

以下是一些解决思路:

  • 完全摆脱线程。在这个简化的示例中,它是无用的。在原始代码中,可能不是。
  • 同步对对象的访问,即使用某种形式的同步来确保线程在您继续主线程之前已完成其序列化。当然,如果主线程只是启动worker,然后立即等待它完成,那么一开始就没有使用线程的意义,因此您需要使同步更加细粒度。
  • 为线程提供其要使用的对象的私有副本。也就是说,不要修改现有的 Person,而是创建一个具有所有相同属性的新 Person,除了 Manager 为空,并将其提供给线程。
于 2013-07-11T11:08:40.943 回答
0

因为您的经理对 newManager 具有相同的引用,实际上 manager 不为空。

于 2013-07-11T11:08:04.393 回答