工作流实例是单例的?控制 activity 实例化?
Workflow instance is singleton? Control activity instancing?
我可以控制工作流的 activity 是否是单例吗?我发现工作流中的相同 activity class 实例在每次执行工作流时都会被(重新)使用。
或者简单地说,在 activity 方法的 Execute() 方法中我得到一个不同的 context.WorkflowInstanceId,但是相同的 context.ActivityInstanceId .
这是设计使然吗?默认情况下?
我可以控制 activity 实例化吗?每次执行工作流时,我可以有一个新的 activity 实例吗?
是的,这是默认行为。 activity 实例可以是多线程环境(Web 上下文)中的同一个实例,这可能会咬你。因此,为了安全起见,您应该始终将所有 activity 变量作为参数。参数通过 ActivityContext 传递,每个 activity 实例都不同。
public class CustomActivity : Activity
{
public int Age { get; set; }
protected override void Execute(CodeActivityContext context)
{
//do some work with Age
}
}
因为不同的线程可以 set/get 相同的实例变量,而不是上面的代码你应该这样做:
public class CustomActivity : Activity
{
public InOutArgument<int> Age { get; set; }
protected override void Execute(CodeActivityContext context)
{
//do some work with Age within CodeActivityContext
}
}
我可以控制工作流的 activity 是否是单例吗?我发现工作流中的相同 activity class 实例在每次执行工作流时都会被(重新)使用。
或者简单地说,在 activity 方法的 Execute() 方法中我得到一个不同的 context.WorkflowInstanceId,但是相同的 context.ActivityInstanceId .
这是设计使然吗?默认情况下?
我可以控制 activity 实例化吗?每次执行工作流时,我可以有一个新的 activity 实例吗?
是的,这是默认行为。 activity 实例可以是多线程环境(Web 上下文)中的同一个实例,这可能会咬你。因此,为了安全起见,您应该始终将所有 activity 变量作为参数。参数通过 ActivityContext 传递,每个 activity 实例都不同。
public class CustomActivity : Activity
{
public int Age { get; set; }
protected override void Execute(CodeActivityContext context)
{
//do some work with Age
}
}
因为不同的线程可以 set/get 相同的实例变量,而不是上面的代码你应该这样做:
public class CustomActivity : Activity
{
public InOutArgument<int> Age { get; set; }
protected override void Execute(CodeActivityContext context)
{
//do some work with Age within CodeActivityContext
}
}