2013-07-11 7 views
0

이 코드를 생각해 보자. 직렬화하기 전에 내가 null로 사람의 관리자를 설정하지만 텍스트 파일에서 멋진 결과를 얻을 :C#에서 객체 참조를 관리하는 방법

{ "이름": "시나", "관리자": { "이름": "Shahrooz"}}

나는 뒤죽박죽이다. 도와주세요.

업데이트 :

내 code.that을 변경 괜찮 :

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

스레드가 사용자에게 다시 할당되기 전에 스레드가 아직 시작 및 완료되지 않았을 수 있습니다. – Jaapjan

+1

문제를 재현하기 위해이 코드를 작성하시기 바랍니다. 그렇지 않으면이 경우에 스레드를 생성해야하는 이유가 없습니다. –

답변

7

문제는 개체 스레드를 주 스레드와 직렬화하기 위해 만드는 스레드입니다. 주 스레드가 Manager 참조를 재설정하기 전에 때로는 객체를 직렬화하기도합니다.

  • 는 모두 스레드 제거하십시오 :

    는 여기에 몇 가지 솔루션 아이디어입니다. 이 축소 된 예에서는 쓸모가 없습니다. 원래 코드에서는 그렇지 않습니다.

  • 개체에 대한 액세스를 동기화합니다. 즉, 주 스레드에서 계속하기 전에 스레드가 직렬화를 완료했는지 확인하기 위해 동기화 형식을 사용합니다. 물론 주 스레드가 작업자를 시작한 후 즉시 완료 될 때까지 대기하면 처음부터 스레드를 사용할 필요가 없으므로 동기화를 좀더 세분화해야합니다.
  • 스레드에게 작업 할 개체의 개인 복사본을 제공하십시오. 즉, 기존 Person을 수정하는 대신 Manager가 null 인 것을 제외하고는 모두 동일한 등록 정보를 갖는 새로운 것을 작성한 다음이를 스레드에 제공하십시오.
+0

어떻게 해결할 수 있습니까? –

+0

Task 클래스로 변환하고 완료 될 때까지 기다립니다. – Jaapjan

+0

또는 스레드로 실행하지 마십시오. 나는 이유가 없어! –

0

관리자가 newManager에 동일한 참조가 실제로 관리자가 null가 아닌 때문이다.

관련 문제