2013-07-15 2 views
1

Я заселение некоторых свойств класса,Установка свойства класса на длинном бегущей нити

Один из них включает в себя сериализацию структуры сущностей в байты [], это занимает некоторое время, так что я хотел бы сделать это в потоке.

Значение никогда не устанавливается, поскольку я предполагаю, что класс и поток теперь выходят за рамки.

код находится ниже, любые идеи будут оценены

public class classA 
{ 
    public void DoSomething() 
    { 
     var classC = new ClassB().DoSomethingElse(); 

     //SAVE CLASS c to database 
     var serialized = classC.GetSerializedDataTable(); // is always null unless i take out the task from class c 
    } 
} 

public class ClassB 
{ 
    public ClassC DoSomethingElse() 
    { 
     var classC = new ClassC(); 

     classC.DataTableValue = new DataTable(); 
     classC.SerializeToByteArray(); 
     return classC; 
    } 
} 

public class ClassC 
{ 
    public DataTable DataTableValue { get; set; } 
    private byte[] serializedData; 


    public void SerializedDataTable() 
    { 
     new Task(() => this.serializedData = this.DataTableValue.SerializeToByteArray()).Start(); 
    } 


    public byte[] GetSerializedDataTable() 
    { 
     return this.serializedData; 
    } 

} 
+2

Совсем немного кода, но еще не завершен. –

+0

Привет Хенк, да, я просто сделал это как пример псевдокода, мой код это намного больше, чем это, но по существу это дает фон тому, что я делаю, в основном я запускаю задачу, и когда я пытаюсь сохранить desirialized значение, его всегда null, вероятно, потому что задача и класс стали недоступны? когда я вынимаю задачу, она явно работает ... – MicroMan

+0

Не могу сказать. Слишком много псевдо нехорошо. И как вы знаете, что Задача завершена? –

ответ

0

A Task не только предназначен для использования для запуска кода в другом потоке, он представляет собой логическую единицу работы, которая может вернуть что-то когда-то ему завершено.

Вашего ClassC.GetSerializedDataTable() появляется, чтобы быть идеальным местом, чтобы использовать тип Task<byte[]> возвращения:

public class ClassC 
{ 
    public DataTable DataTableValue { get; set; } 
    private Task<byte[]> serializeDataTask; 

    public void SerializeDataTable() 
    { 
     serializeDataTask = Task.Factory.StartNew(() => this.DataTableValue.SerializeToByteArray()); 
    } 

    public Task<byte[]> GetSerializedDataTable() 
    { 
     // You can either throw or start it lazily if SerializeDataTable hasnt been called yet. 
     if (serializeDataTask == null) 
      throw new InvalidOperationException(); 
     return serializeDataTask; 
    } 
} 

И теперь ваш клиентский код может использовать Целевой тип возвращаемого значения в разумных путях. Если результат уже доступен, он может немедленно использовать его через Task.Result. В противном случае он может дождаться завершения или выполнить какую-либо другую работу до ее завершения. Дело в том, что код вызова теперь имеет контекст, чтобы принять наиболее подходящий курс действий.

Назад к вашему примеру:

public void DoSomething() 
{ 
    var classC = new ClassB().DoSomethingElse(); 

    //SAVE CLASS c to database 
    var serializeTask = classC.GetSerializedDataTable(); 
    // will obtain result if available, will block current thread and wait for serialized data if task still running. 
    var serializedData = serializeTask.Result; 
} 
Смежные вопросы