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