gpt4 book ai didi

c# - 如何在执行期间暂停、保存状态并稍后从同一点继续?

转载 作者:可可西里 更新时间:2023-11-01 09:12:04 29 4
gpt4 key购买 nike

我有一个线程正在做一些处理。我希望能够在执行期间停止该线程,以某种方式保存它的位置(以及它正在操作的对象的状态),然后在以后的日期(所以在我的计算机重新启动之后)从那个位置继续。

在 C# 中这是不可能的,对吧?如果不是,实现此功能的正确设计是什么?

所以我最初的愿望是拥有类似的东西

class Foo : Task {   
void override Execute(){
//example task
while(someCondition){
...do stuff...
}
}
}

并且能够在该函数内的任何时候暂停/保存。当功能结束时,每个人都知道它已经完成。作为替代方案,也许这是更好的方法

class Foo : Task {


void override Execute(State previousState){
//set someCondition, other stuff
//IsPaused = false;
previousState.setUpStuff();

//example task
while(someCondition){
...do stuff...
if(base.IsPauseRequested){
base.UpdateState(); //this would be a bit different but just to get the idea
base.IsPaused = true;
return;
}
}

base.RaiseNotifyTaskComplete();
}

}

所以第一种情况对于其他需要继承我的基类的人来说要简单得多,因为他们只需要实现Execute函数。然而,在第二种情况下,他们必须考虑先前的状态,并管理存在良好暂停点的位置。有更好的方法吗?

最佳答案

您想要的可以通过可序列化的状态机来完成。基本上,您将局部变量更改为类中的字段,并添加一个保持状态的字段——原始方法代码中的位置。此类将是 [Serializable] 并且它将有一个方法,如 MoveNext(),该方法执行一项工作并返回。工作时,你在循环中调用这个方法。当你想停止时,你等到当前调用结束,跳出循环,然后将状态机序列化到磁盘。

基于原始方法的复杂性和你想要“检查点”的频率(当 MoveNext() 方法返回时你可以选择继续或不),状态机可以可以像只有一种状态一样简单,也可以非常复杂。

C# 编译器在编译迭代器 block (和 C# 5 的 async 方法)时执行非常相似的转换。但它不是为了这个目的,它不标记生成的类 [Serializable],所以我认为你不能使用它。虽然阅读一些关于如何实际完成这种转换的文章可能会帮助您自己做同样的事情。

关于c# - 如何在执行期间暂停、保存状态并稍后从同一点继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7996778/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com