C# 在长时间运行的线程上设置类属性

C# 在长时间运行的线程上设置类属性,c#,.net,multithreading,task,threadpool,C#,.net,Multithreading,Task,Threadpool,我正在填充一些类属性 其中之一涉及将实体结构序列化为字节[],这需要一些时间,所以我想在线程中完成 该值永远不会被设置,因为我假设类和线程现在超出范围 代码如下,如有任何想法,将不胜感激 public class classA { public void DoSomething() { var classC = new ClassB().DoSomethingElse(); //SAVE CLASS c to database

我正在填充一些类属性

其中之一涉及将实体结构序列化为字节[],这需要一些时间,所以我想在线程中完成

该值永远不会被设置,因为我假设类和线程现在超出范围

代码如下,如有任何想法,将不胜感激

   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;
    }

}

任务
不仅仅用于在另一个线程上运行代码,它还表示一个逻辑工作单元,完成后可以返回一些内容

您的
ClassC.GetSerializedDataTable()
似乎是使用
任务
返回类型的理想场所:

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;
    }
}

相当多的代码,但仍然不完整。嗨,Henk,是的,我只是做了一个伪代码示例,我的代码远不止这些,但本质上这为我正在做的事情提供了背景,基本上我启动了任务,当我试图保存所需的值时,它总是空的,可能是因为任务和类已经超出了范围?当我完成任务时,它显然起作用了……我说不出来。太多的假货是不好的。你怎么知道任务已经完成了呢?我不监视任务是否完成,但基本上它需要90毫秒,之后的代码需要200毫秒,所以它有很多时间来完成,但在它完成之前,我认为任务已经被GC吞噬了,因为值总是保存为null。。。如果我在ClassC-SerializedDataTable中等待大约100ms,那么它就可以工作了。。。但是这对我没有帮助,因为我失去了线程的优势……在返回
byte[]
之前,您应该检查任务是否在
getserializeddatable()
中完成。若你们说任务有足够的时间来完成,那个么这不应该是一个很大的性能损失(阻塞时间太长)。
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; 
}