C# WF:检查工作流应用程序是否已从自定义活动中取消

C# WF:检查工作流应用程序是否已从自定义活动中取消,c#,.net,workflow-foundation,workflow-foundation-4,C#,.net,Workflow Foundation,Workflow Foundation 4,如果调用了工作流应用程序的“取消”方法,如何从我的NativeActivity检查 我试图使用上下文的'IsCancellationRequested'属性,但效果不太好 这是我的样本: public class Program { static void Main(string[] args) { ManualResetEventSlim mre = new ManualResetEventSlim(false); WorkflowApplica

如果调用了工作流应用程序的“取消”方法,如何从我的NativeActivity检查

我试图使用上下文的'IsCancellationRequested'属性,但效果不太好

这是我的样本:

public class Program
{
    static void Main(string[] args)
    {
        ManualResetEventSlim mre = new ManualResetEventSlim(false);
        WorkflowApplication app = new WorkflowApplication(new Sequence() { Activities = {new tempActivity(), new tempActivity() } });
        app.Completed += delegate(WorkflowApplicationCompletedEventArgs e)
        {
            mre.Set();
        };
        app.Run(TimeSpan.MaxValue);
        Thread.Sleep(2000);
        app.BeginCancel(null,null);
        mre.Wait();
    }
}

public class tempActivity : NativeActivity
{
    protected override void Execute(NativeActivityContext context)
    {
        Console.WriteLine("Exec tempActivity");
        for (int i = 0; i < 10; i++)
        {
            Thread.Sleep(1000);
            Console.Write(".");
            if (context.IsCancellationRequested)
                return;
        }
    }
}
公共类程序
{
静态void Main(字符串[]参数)
{
ManualResetEventSlim mre=新的ManualResetEventSlim(错误);
WorkflowApplication app=新的WorkflowApplication(新序列(){Activities={new tempActivity(),new tempActivity()}});
app.Completed+=委托(WorkflowApplicationCompletedEventArgs e)
{
mre.Set();
};
应用程序运行(TimeSpan.MaxValue);
《睡眠》(2000年);
app.begingacel(null,null);
mre.Wait();
}
}
公共课堂活动:本土活动
{
受保护的覆盖无效执行(NativeActivityContext上下文)
{
Console.WriteLine(“Exec tempActivity”);
对于(int i=0;i<10;i++)
{
睡眠(1000);
控制台。写(“.”);
if(context.IsCancellationRequested)
返回;
}
}
}

谢谢

工作流中的几乎所有内容都是异步调度和执行的。这包括取消,因此执行中的阻塞可确保从不处理取消请求

您需要编写类似以下内容的活动:

public class tempActivity : NativeActivity
{
    private Activity Delay { get; set; }
    private Variable<int> Counter { get; set; }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        Counter = new Variable<int>();
        Delay = new Delay() { Duration = TimeSpan.FromSeconds(1) };

        metadata.AddImplementationChild(Delay);
        metadata.AddImplementationVariable(Counter);

        base.CacheMetadata(metadata);
    }


    protected override void Execute(NativeActivityContext context)
    {
        OnCompleted(context, null);
    }

    private void OnCompleted(NativeActivityContext context, ActivityInstance completedInstance)
    {
        var counter = Counter.Get(context);
        if (counter < 10 && !context.IsCancellationRequested)
        {
            Console.Write(".");
            Counter.Set(context, counter + 1);
            context.ScheduleActivity(Delay, OnCompleted);
        }
    }
}
公共类临时活动:NativeActivity
{
私有活动延迟{get;set;}
专用变量计数器{get;set;}
受保护的覆盖无效缓存元数据(NativeActivityMetadata)
{
计数器=新变量();
延迟=新延迟(){Duration=TimeSpan.FromSeconds(1)};
元数据。AddImplementationChild(延迟);
元数据.AddImplementationVariable(计数器);
base.CacheMetadata(元数据);
}
受保护的覆盖无效执行(NativeActivityContext上下文)
{
未完成(上下文,空);
}
私有void未完成(NativeActivityContext上下文,ActivityInstance completedInstance)
{
var counter=counter.Get(上下文);
if(计数器<10&&!context.IsCancellationRequested)
{
控制台。写(“.”);
Counter.Set(上下文,计数器+1);
调度活动(延迟,未完成);
}
}
}

我不希望cancel操作会中止execute方法的运行线程,但我仍然希望得到工作流应用程序已被取消的某种通知。为什么“IsCancellationRequested”属性未设置为true?只要您对运行时进行更改,它就会设置为true。只要你没有从Execute()返回,运行时就不会做任何更改。我仍然不明白为什么(它不能从其他线程运行?)。也许你可以多解释一点或者添加一个额外的链接。谢谢