C# 从AsyncCodeActivity中执行AsyncCodeActivity

C# 从AsyncCodeActivity中执行AsyncCodeActivity,c#,workflow-foundation-4,C#,Workflow Foundation 4,我被困在一个点上,我想写一个活动来封装另一个预先存在的活动 预先存在的活动是call SaySpeech,它有一些参数。所需的是一个连接和一个文本(它将使用TTS对连接说话)。这是一项不同步的活动 我正在制作一个名为SayPassword的新活动,它接受与SaySpeech相同的参数,但不是TextToSpeak,而是PasswordToSpeak。其前奏是: 现在,在内部调用SaySpeech之前,我需要为它提供与接收到的SayPassword相同的参数,并用生成的PasswordToSpea

我被困在一个点上,我想写一个活动来封装另一个预先存在的活动

预先存在的活动是call SaySpeech,它有一些参数。所需的是一个连接和一个文本(它将使用TTS对连接说话)。这是一项不同步的活动

我正在制作一个名为SayPassword的新活动,它接受与SaySpeech相同的参数,但不是TextToSpeak,而是PasswordToSpeak。其前奏是:

现在,在内部调用SaySpeech之前,我需要为它提供与接收到的SayPassword相同的参数,并用生成的PasswordToSpeak替换TextToSpeak参数值

一切都完成了,只是我不知道如何在代码内部启动SaySpeech活动?我需要在SayPassword中调用SaySpeech的BeginExecute,并使用SayPassword的EndExecute调用EndExecute


有指针吗?

CodeActivity不允许您执行子活动,您需要使用。在Execute()方法中,可以使用请求运行时为您执行另一个活动

public sealed class MyActivity : NativeActivity
{
    public Activity Body { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        context.ScheduleActivity(Body);
    }
}

CodeActivity不允许您执行子活动,您需要使用。在Execute()方法中,可以使用请求运行时为您执行另一个活动

public sealed class MyActivity : NativeActivity
{
    public Activity Body { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        context.ScheduleActivity(Body);
    }
}

嗯。经过六个小时的试验和测试,我终于开始了我的活动。以下是最终代码:

public sealed class SayPassword : NativeActivity
{

    [RequiredArgument]
    public InArgument<ConnectionInfo> Connection { get; set; }
    [RequiredArgument]
    public InArgument<String> Password { get; set; }

    public InArgument<String> Language { get; set; }
    public InArgument<Int32?> Speaker { get; set; }

    #region Implementation
    private SaySpeech InnerSaySpeech { get; set; }

    private Variable<ConnectionInfo> TempConnectionInfo { get; set; }
    private Variable<String> TempUtterance { get; set; }
    private Variable<String[]> TempParameters { get; set; }
    private Variable<String> TempLanguage { get; set; }
    private Variable<Int32?> TempSpeaker { get; set; }
    #endregion

    public SayPassword()
    {
        TempConnectionInfo = new Variable<ConnectionInfo>();
        TempUtterance = new Variable<String>();
        TempParameters = new Variable<String[]>();
        TempLanguage = new Variable<String>();
        TempSpeaker = new Variable<Int32?>();

        InnerSaySpeech = new SaySpeech
        {
            Connection = new InArgument<ConnectionInfo>(TempConnectionInfo),
            Utterance = new InArgument<string>(TempUtterance),
            Parameters = new InArgument<string[]>(TempParameters),
            Language = new InArgument<string>(TempLanguage),
            Speaker = new InArgument<int?>(TempSpeaker)
        };
    }

    private String[] GetSentences(String password) {}

    private static string GetPlaceholderString(Int32 NumberOfPlaceholders) {}

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);

        metadata.AddImplementationVariable(TempConnectionInfo);
        metadata.AddImplementationVariable(TempUtterance);
        metadata.AddImplementationVariable(TempParameters);
        metadata.AddImplementationVariable(TempLanguage);
        metadata.AddImplementationVariable(TempSpeaker);

        metadata.AddImplementationChild(InnerSaySpeech);
    }

    protected override void Execute(NativeActivityContext context)
    {
        String[] SpeakablePassword = GetSentences(Password.Get(context));

        context.SetValue(TempConnectionInfo, Connection.Get(context));
        context.SetValue(TempUtterance, GetPlaceholderString(SpeakablePassword.Length));
        context.SetValue(TempParameters, SpeakablePassword);
        context.SetValue(TempLanguage, Language.Get(context));
        context.SetValue(TempSpeaker, Speaker.Get(context));

        context.ScheduleActivity(InnerSaySpeech);
    }
}
公共密封类密码:NativeActivity
{
[必需参数]
公共InArgument连接{get;set;}
[必需参数]
公共InArgument密码{get;set;}
公共非语法语言{get;set;}
公开非公开演讲者{get;set;}
#区域实施
私用SaySpeech InnerSaySpeech{get;set;}
私有变量TempConnectionInfo{get;set;}
私有变量TempUtterance{get;set;}
私有变量TempParameters{get;set;}
私有变量TempLanguage{get;set;}
私有变量TempSpeaker{get;set;}
#端区
公共密码()
{
TempConnectionInfo=新变量();
TempUtterance=新变量();
TempParameters=新变量();
TempLanguage=新变量();
TempSpeaker=新变量();
InnerSaySpeech=新SaySpeech
{
连接=新的InArgument(TempConnectionInfo),
话语=新的非言语(临时话语),
参数=新的不一致性(临时参数),
语言=新语言(模板语言),
演讲者=新的非演讲者(临时演讲者)
};
}
私有字符串[]获取句子(字符串密码){}
私有静态字符串GetPlaceholderString(Int32 NumberOfPlaceholders){}
受保护的覆盖无效缓存元数据(NativeActivityMetadata)
{
base.CacheMetadata(元数据);
元数据.AddImplementationVariable(TempConnectionInfo);
元数据.AddImplementationVariable(tempurtance);
元数据.AddImplementationVariable(TempParameters);
metadata.AddImplementationVariable(模板语言);
元数据.AddImplementationVariable(TempSpeaker);
元数据.AddImplementationChild(InnerSaySpeech);
}
受保护的覆盖无效执行(NativeActivityContext上下文)
{
String[]SpeakablePassword=Get句子(Password.Get(context));
SetValue(TempConnectionInfo,Connection.Get(context));
SetValue(TempUtterance,GetPlaceholderString(SpeakablePassword.Length));
SetValue(TempParameters,SpeakablePassword);
SetValue(TempLanguage,Language.Get(context));
SetValue(TempSpeaker,Speaker.Get(context));
日程安排活动(InnerSaySpeech);
}
}
我需要创建用于映射传入参数的中间变量,以便将它们成功地传递给内部活动


这篇文章对我帮助很大。工作流框架似乎不是您日常使用的c#代码。我还有很多东西要学。希望这对其他人有用。

好的。经过六个小时的试验和测试,我终于开始了我的活动。以下是最终代码:

public sealed class SayPassword : NativeActivity
{

    [RequiredArgument]
    public InArgument<ConnectionInfo> Connection { get; set; }
    [RequiredArgument]
    public InArgument<String> Password { get; set; }

    public InArgument<String> Language { get; set; }
    public InArgument<Int32?> Speaker { get; set; }

    #region Implementation
    private SaySpeech InnerSaySpeech { get; set; }

    private Variable<ConnectionInfo> TempConnectionInfo { get; set; }
    private Variable<String> TempUtterance { get; set; }
    private Variable<String[]> TempParameters { get; set; }
    private Variable<String> TempLanguage { get; set; }
    private Variable<Int32?> TempSpeaker { get; set; }
    #endregion

    public SayPassword()
    {
        TempConnectionInfo = new Variable<ConnectionInfo>();
        TempUtterance = new Variable<String>();
        TempParameters = new Variable<String[]>();
        TempLanguage = new Variable<String>();
        TempSpeaker = new Variable<Int32?>();

        InnerSaySpeech = new SaySpeech
        {
            Connection = new InArgument<ConnectionInfo>(TempConnectionInfo),
            Utterance = new InArgument<string>(TempUtterance),
            Parameters = new InArgument<string[]>(TempParameters),
            Language = new InArgument<string>(TempLanguage),
            Speaker = new InArgument<int?>(TempSpeaker)
        };
    }

    private String[] GetSentences(String password) {}

    private static string GetPlaceholderString(Int32 NumberOfPlaceholders) {}

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);

        metadata.AddImplementationVariable(TempConnectionInfo);
        metadata.AddImplementationVariable(TempUtterance);
        metadata.AddImplementationVariable(TempParameters);
        metadata.AddImplementationVariable(TempLanguage);
        metadata.AddImplementationVariable(TempSpeaker);

        metadata.AddImplementationChild(InnerSaySpeech);
    }

    protected override void Execute(NativeActivityContext context)
    {
        String[] SpeakablePassword = GetSentences(Password.Get(context));

        context.SetValue(TempConnectionInfo, Connection.Get(context));
        context.SetValue(TempUtterance, GetPlaceholderString(SpeakablePassword.Length));
        context.SetValue(TempParameters, SpeakablePassword);
        context.SetValue(TempLanguage, Language.Get(context));
        context.SetValue(TempSpeaker, Speaker.Get(context));

        context.ScheduleActivity(InnerSaySpeech);
    }
}
公共密封类密码:NativeActivity
{
[必需参数]
公共InArgument连接{get;set;}
[必需参数]
公共InArgument密码{get;set;}
公共非语法语言{get;set;}
公开非公开演讲者{get;set;}
#区域实施
私用SaySpeech InnerSaySpeech{get;set;}
私有变量TempConnectionInfo{get;set;}
私有变量TempUtterance{get;set;}
私有变量TempParameters{get;set;}
私有变量TempLanguage{get;set;}
私有变量TempSpeaker{get;set;}
#端区
公共密码()
{
TempConnectionInfo=新变量();
TempUtterance=新变量();
TempParameters=新变量();
TempLanguage=新变量();
TempSpeaker=新变量();
InnerSaySpeech=新SaySpeech
{
连接=新的InArgument(TempConnectionInfo),
话语=新的非言语(临时话语),
参数=新的不一致性(临时参数),
语言=新语言(模板语言),
演讲者=新的非演讲者(临时演讲者)
};
}
私有字符串[]获取句子(字符串密码){}
私有静态字符串GetPlaceholderString(Int32 NumberOfPlaceholders){}
受保护的覆盖无效缓存元数据(NativeActivityMetadata)
{
base.CacheMetadata(元数据);
元数据.AddImplementationVariable(TempConnectionInfo);
元数据.AddImplementationVariable(tempurtance);
元数据.AddImplementationVariable(TempParameters);
metadata.AddImplementationVariable(模板语言);
metadata.AddImplementation v