我有一个正在做一些处理的线程.我希望能够在执行期间停止此线程,以某种方式保存它的位置(以及它正在操作的对象的状态),然后在以后从该位置继续(因此在我的计算机重新启动后).
在C#中,这是不可能的吗?如果没有,实现此功能的正确设计是什么?
所以我最初的愿望是拥有类似的东西
class Foo : Task {
void override Execute(){
//example task
while(someCondition){
...do stuff...
}
}
}
Run Code Online (Sandbox Code Playgroud)
并能够在该功能中的任何点暂停/保存.当功能结束时,每个人都知道它已经完成.作为替代方案,也许这是更好的方法
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();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,对于需要继承我的基类的其他人来说,第一种情况要简单得多,因为他们只需要实现Execute函数.但是,在第二种情况下,他们必须考虑先前的状态,并管理存在良好暂停点的位置.有一个更好的方法吗?
我在为Outlook 2007加载项创建安装文件时遇到一些问题.
问题是加载项需要有一个引用清单的注册表项(http://msdn.microsoft.com/en-us/library/bb386106.aspx).该项目构建一个显示在bin\debug文件夹中的清单文件.但是,在我的安装项目中,如果我去添加项目输出,则清单永远不会列为输出的一部分.奇怪的是,安装程序确实创建了一个注册表项,该注册表项引用了我的bin\debug文件夹中的清单,但这不合适,因为该文件夹在我将部署到的计算机上不可用.
谢谢.
====================================
对于那些感兴趣的人,一些背景问题
奇怪,嗯?
看来这将是一个普遍的问题,但我不知道解决该问题的最佳方法。我希望能够将一个实体发送到视图,对视图中的实体进行更改,但是如果用户从视图中取消,则可以取消(删除)那些更改。什么是执行此操作的正确方法。
我有两个选择,但我认为应该有其他更好的选择
1)获取一个实体,创建一个克隆,将克隆发送到视图...如果更改被接受,则使用克隆的值更新原始实体
2)将实体发送到视图,如果用户取消,则从NHibernate的缓存中删除该实体,然后从数据库中重新加载它
对于(2),对我来说,问题是,从缓存中删除旧实体后,仍然可以在我的整个项目中引用该旧实体。
编辑:
好的,因此如果我要实现方法(2),则必须采用evict方法。谢谢,我不记得那个细节。但是,引用我的旧逐出实体的视图对象问题使该问题难以解决。我不能只是在引发自定义逐出事件时不自动将视图更新为一个新实体,而不必在每个实体中都有自定义代码来重新绑定。在某些情况下,重新绑定可能并不容易。我可能需要考虑的更多,因为我可能过于复杂了,但此刻,此方法似乎比较棘手。
我怀疑我会被方法(1)所困扰,该方法有其自身的一系列问题,但将等待更长的时间才能看到其他人是否有一些想法。
编辑2:刚发现这个。我认为它几乎涵盖了详细的答案,并且附带了一个出色的演示项目- 使用NHibernate构建桌面待办事项应用程序-http: //msdn.microsoft.com/zh-cn/magazine/ee819139.aspx
除此之外,NHibernate还具有一个Session.Refresh(Object entity)函数,该函数似乎可以解决确切的问题。因此,当一个实体被更改但在保存之前被取消时,我可以调用Session.Refresh从数据库中重新加载它并放弃更改。
我有一个CPU密集型任务(循环一些数据和评估结果).我想为这些使用多个内核,但我的性能始终比仅使用单个内核更糟糕.
我试过了:
我通过计算我可以完成的迭代总数并除以我处理问题所花费的时间来测量结果.使用单核时,我的结果明显更好.
一些兴趣点:
想知道这里发生了什么?
更新线程:我怀疑webworker-threads中的一个错误 现在跳过快递,我认为这个问题可能与我的线程循环有关.我正在做的是创建一个线程,然后尝试连续运行它们,但在它们之间来回发送数据.即使两个线程都在耗尽CPU,但只有线程0返回值.我的假设是发出任何通常最终将消息发送到空闲时间最长的线程,但似乎并非如此.我的设置看起来像这样
在threadtask.js中
thread.on('init', function() {
thread.emit('ready');
thread.on('start', function(data) {
console.log("THREAD " + thread.id + ": execute task");
//...
console.log("THREAD " + thread.id + ": emit result");
thread.emit('result', otherData));
});
});
Run Code Online (Sandbox Code Playgroud)
main.js
var tp = Threads.createPool(NUM_THREADS);
tp.load(threadtaskjsFilePath);
var readyCount = 0;
tp.on('ready', function() {
readyCount++;
if(readyCount == tp.totalThreads()) {
console.log('MAIN: Sending first start event');
tp.all.emit('start', JSON.stringify(data));
}
});
tp.on('result', function(eresult) {
var result = …Run Code Online (Sandbox Code Playgroud) 我有一个nodejs应用程序,有一些昂贵的计算.我正在考虑在java中做这个部分,这样我就可以更轻松地利用线程和数学库.是否有一种简单的方法让nodejs与外部Java库通信?
java库将包含一个经常调用javascript函数的循环.由于让这两个库不断交谈(而不是打包整个任务,将其发送到jvm,然后返回结果),我是否会看到很大的性能损失?
我在设立Doctrine方面遇到了一些困难,我希望一些大师可以帮助我.如果我尝试自己保存MainEntity,它可以正常工作.但是,如果我将"标签"添加到此实体的标签集合中,则会出现错误.
这是我的信息:我有与此类似的实体
namespace CG;
class Content
{
public $id;
public $tags;
public function __construct()
{
$this->tags = new ArrayCollection();
}
}
/* this is single table inheritance */
class Tag extends TagAssociation
{
public $id;
public $term;
public $content;
}
class Term
{
public $id;
public $name;
}
Run Code Online (Sandbox Code Playgroud)
制图
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="CG\Content" table="cg_content">
<id name="id" type="integer" column="Id">
<generator strategy="AUTO" />
</id>
<one-to-many field="tags" target-entity="CG\Tag" mapped-by="tagContent">
<join-column name="ContentId" referenced-column-name="Id" nullable="false" fetch="FETCH" />
<cascade>
<cascade-persist/>
</cascade>
</one-to-many>
</doctrine-mapping> …Run Code Online (Sandbox Code Playgroud) 我是使用持续集成的新手,并决定选择TeamCity.我遇到的一个问题是由于缺少依赖性,我的代码没有编译.
(8,7):错误CS0246:找不到类型或命名空间名称'CrystalDecisions'(您是否缺少using指令或程序集引用?)
所以,我不太确定在这里做什么是正确的.
选项(1)似乎可能是一个问题,因为我可能有多个项目需要不同版本的Crystal Reports,也许我不能安装它们.选项(2)似乎可以通过命令行.我猜这是正常的做法吗?
谢谢
c# ×4
node.js ×2
.net ×1
deployment ×1
doctrine-orm ×1
entity ×1
express ×1
java ×1
nhibernate ×1
outlook ×1
performance ×1
php ×1
teamcity ×1
vsto ×1
web-worker ×1