首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TrackingParticipant中使用SynchronizationContext

在TrackingParticipant中使用SynchronizationContext
EN

Stack Overflow用户
提问于 2012-08-29 20:24:18
回答 1查看 406关注 0票数 0

我有一个自定义跟踪参与者:

代码语言:javascript
复制
public class ErsTrackingParticipant : TrackingParticipant, IErsTrackingParticipant
{
    private readonly INHibernateRepository<ErsTrackingRecord> _ersTrackingRecordRepository;

    public ErsTrackingParticipant(INHibernateRepository<ErsTrackingRecord> ersTrackingRecordRepository)
    {
        this._ersTrackingRecordRepository = ersTrackingRecordRepository;
    }

    protected override void Track(TrackingRecord record, TimeSpan timeout)
    {
        ErsTrackingRecord ersTrackingRecord = TrackingCommand.GetTrackingRecord(record);
        this._ersTrackingRecordRepository.Save(ersTrackingRecord);
    }
}

public interface IErsTrackingParticipant
{
}

和工作流主机帮助器:

代码语言:javascript
复制
public class WorkflowHostHelper: IWorkflowHostHelper
{
    private WorkflowApplication _workflowApplication;
    AutoResetEvent _instanceUnloaded = new AutoResetEvent(false);

    private IErsTrackingParticipant _ersTrackingParticipant;

    private bool _isCompleted = false;

    public string InstanceStoreConnectionString { get { return ConfigurationManager.AppSettings["InstanceStoreConnectionString"]; } }

    public WorkflowHostHelper(IErsTrackingParticipant ersTrackingParticipant)
    {
        _ersTrackingParticipant = ersTrackingParticipant;
    }

    public void Initialize(Activity workflowType)
    {
        _workflowApplication = new WorkflowApplication(workflowType);
        TrackingProfile trackingProfile = new TrackingProfile() { Name = "TroubleshootingProfile", ActivityDefinitionId = "*" };
        trackingProfile.Queries.Add(new WorkflowInstanceQuery { States = { "*" } });
        trackingProfile.Queries.Add(new ActivityStateQuery { States = { "*" } });
        trackingProfile.Queries.Add(new ActivityScheduledQuery());
        trackingProfile.Queries.Add(new BookmarkResumptionQuery() { Name = "*" });

        _workflowApplication.Extensions.Add(_ersTrackingParticipant);

        SynchronizationContext synchronizationContext = SynchronizationContext.Current;
        _workflowApplication.SynchronizationContext = synchronizationContext;
        _workflowApplication.InstanceStore = new SqlWorkflowInstanceStore(InstanceStoreConnectionString);

        _workflowApplication.PersistableIdle = (e) =>
            { return PersistableIdleAction.Persist; };
        _workflowApplication.Completed = (e) =>
            {
                _isCompleted = true;
                _instanceUnloaded.Set();
            };
        _workflowApplication.Idle = (e) =>
            { _instanceUnloaded.Set(); };

    } //Rest ommiitted...

当存储库尝试保存回数据库时,它会出错:

代码语言:javascript
复制
'((SharpArch.NHibernate.NHibernateRepositoryWithTypedId<EmployeeRequestSystem.Domain.ErsTrackingRecord,int>)(this._ersTrackingRecordRepository)).Session' threw an exception of type 'System.NullReferenceException'

SharpArch.NHibernate.Contracts.Repositories.INHibernateRepositoryWithTypedId<T,TId>.DbContext = {SharpArch.NHibernate.DbContext}

在工作流活动中,我可以引用上下文并使用服务定位器,例如:

代码语言:javascript
复制
    protected override void CacheMetadata(CodeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);
        metadata.AddDefaultExtensionProvider<INHibernateRepository<AuthorisationRequest>>(
            () => new NHibernateRepository<AuthorisationRequest>());
    }

..。

代码语言:javascript
复制
    protected override void Execute(CodeActivityContext context)
    {
        var authorisationRequestRepoistory = context.GetExtension<INHibernateRepository<AuthorisationRequest>>();

如何才能将正确的上下文传递到我的ErsTrackingParticipant?

EN

回答 1

Stack Overflow用户

发布于 2012-08-31 03:25:09

从你的问题看,我不清楚SynchronizationContext与空引用有什么关系。如果你能准确地追踪到什么是空的,那将会有所帮助。

在大多数情况下,SynchronizationContext.Current属性将为空。只有当主机环境中的某些东西进行设置时,它才具有值。除非我发现SynchronizationContext.Current有一个值,否则我不会设置WorkflowApplication.Synchronization上下文属性。

我不明白您为什么要在跟踪参与者中使用“上下文”。你指的是什么“上下文”?SynchronizationContext?CodeActivityContext?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12177887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档