小编i8a*_*bug的帖子

如何在执行期间暂停,保存状态,并在以后从同一点继续?

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

在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函数.但是,在第二种情况下,他们必须考虑先前的状态,并管理存在良好暂停点的位置.有一个更好的方法吗?

c# design-patterns

10
推荐指数
1
解决办法
1579
查看次数

VSTO(Outlook加载项)安装部署(C#)

我在为Outlook 2007加载项创建安装文件时遇到一些问题.

问题是加载项需要有一个引用清单的注册表项(http://msdn.microsoft.com/en-us/library/bb386106.aspx).该项目构建一个显示在bin\debug文件夹中的清单文件.但是,在我的安装项目中,如果我去添加项目输出,则清单永远不会列为输出的一部分.奇怪的是,安装程序确实创建了一个注册表项,该注册表项引用了我的bin\debug文件夹中的清单,但这不合适,因为该文件夹在我将部署到的计算机上不可用.

谢谢.

====================================

对于那些感兴趣的人,一些背景问题

  1. 如果我在我的设置中使用项目输出,VSTO加载项第一次安装就好了.如果我使用相同的设置卸载并重新安装,则无法正确安装.如果我重建设置,它会再次安装正常(换句话说,它只在第一次安装时安装).
  2. 我更正了(1)但是从我的安装项目中删除了项目输出,而是手动添加文件(我的dll +清单),然后更新注册表项以指向添加的清单.这一次,我可以使用相同的设置卸载并重新安装.但是,出于某种原因,安装程序会创建两个注册表项,一个是我手动放入的,指的是我包含的清单,另一个自动引用并指向bin\debug文件夹中的清单.我无法删除第二组注册表项,因为它们没有出现在我的安装项目中.将它们留在那里的问题是加载项执行每个命令两次(因为它被注册了两次).

奇怪,嗯?

c# deployment outlook vsto

6
推荐指数
1
解决办法
2万
查看次数

NHibernate和取消实体更改

看来这将是一个普遍的问题,但我不知道解决该问题的最佳方法。我希望能够将一个实体发送到视图,对视图中的实体进行更改,但是如果用户从视图中取消,则可以取消(删除)那些更改。什么是执行此操作的正确方法。

我有两个选择,但我认为应该有其他更好的选择

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从数据库中重新加载它并放弃更改。

.net c# nhibernate entity

5
推荐指数
1
解决办法
2870
查看次数

nodejs - 我发现多线程或使用多个进程比单个进程慢.为什么?

我有一个CPU密集型任务(循环一些数据和评估结果).我想为这些使用多个内核,但我的性能始终比仅使用单个内核更糟糕.

我试过了:

  • 通过表达并将任务发送到这些进程,在不同端口上创建多个进程
  • 使用webworker-threads使用线程池在不同的线程中运行任务

我通过计算我可以完成的迭代总数并除以我处理问题所花费的时间来测量结果.使用单核时,我的结果明显更好.

一些兴趣点:

  • 我可以确定何时只使用一个核心以及何时通过任务管理器使用多个核心.我正在使用预期的内核数量.
  • 我有很多公羊
  • 我试过只运行2或3个核心
  • 我添加了nextTicks,在这种情况下似乎没有任何影响
  • 这些任务各需要几秒钟,所以我不觉得我在开销上损失惨重

想知道这里发生了什么?

更新线程:我怀疑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)

performance multithreading web-worker node.js express

5
推荐指数
1
解决办法
388
查看次数

node.js是否可以导入java库

我有一个nodejs应用程序,有一些昂贵的计算.我正在考虑在java中做这个部分,这样我就可以更轻松地利用线程和数学库.是否有一种简单的方法让nodejs与外部Java库通信?

java库将包含一个经常调用javascript函数的循环.由于让这两个库不断交谈(而不是打包整个任务,将其发送到jvm,然后返回结果),我是否会看到很大的性能损失?

java node.js

5
推荐指数
1
解决办法
1518
查看次数

学说问题; 如果向关系添加项目,则无法保留实体

我在设立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)

php doctrine-orm

4
推荐指数
1
解决办法
1万
查看次数

如何使用Continuous Integration服务器处理构建破坏外部依赖项?(例如,使用TeamCity的Crystal Reports)

我是使用持续集成的新手,并决定选择TeamCity.我遇到的一个问题是由于缺少依赖性,我的代码没有编译.

(8,7):错误CS0246:找不到类型或命名空间名称'CrystalDecisions'(您是否缺少using指令或程序集引用?)

所以,我不太确定在这里做什么是正确的.

  1. 我是否可以安装Crystal Reports可再发行组件并让它永远坐在那里?
  2. 我是否设置了我的构建,以便在编译完成之前安装Crystal Reports并在所有测试完成后卸载?
  3. 其他一些我不知道的选择?

选项(1)似乎可能是一个问题,因为我可能有多个项目需要不同版本的Crystal Reports,也许我不能安装它们.选项(2)似乎可以通过命令行.我猜这是正常的做法吗?

谢谢

c# teamcity continuous-integration

1
推荐指数
1
解决办法
613
查看次数