0

我是 Windows 工作流的新手,正在尝试编写一个长时间运行的进程。
我也试图限制这个过程可以运行多长时间。
我正在调用 WorkflowInvoker.Invoke 来触发我的工作流,通过它一小段时间进行测试。

如果我尝试某些活动,这似乎很有效。
但是如果我使用 CodeActivity,它似乎完全忽略了我的超时。

为什么是这样?如果需要的时间太长,如何使我的 CodeActivity 超时?

使用延迟活动的示例:(
在此示例中,抛出 TimeOutException)

Activity wf = new Sequence()
{
    Activities =
    {
        new Delay() 
        { 
            Duration = TimeSpan.FromSeconds(10) 
        },
    }
};

try
{
    WorkflowInvoker.Invoke(wf, TimeSpan.FromSeconds(5));
}
catch (TimeoutException ex)
{
    Console.WriteLine(ex.Message);
}

尝试使用 CodeActivity 的
示例:(在此示例中,不抛出 TimeOutException)

public class LongActivity : CodeActivity
{
    protected override void Execute(CodeActivityContext context)
    {
        Thread.Sleep(TimeSpan.FromSeconds(10));
    }
}

Activity wf = new Sequence()
{
    Activities =
    {
        new LongActivity()
    }
};

try
{
    WorkflowInvoker.Invoke(wf, TimeSpan.FromSeconds(5));
}    
catch (TimeoutException ex)
{
    Console.WriteLine(ex.Message);
}
4

1 回答 1

0

工作流运行时只有在它负责时才能采取行动,并且如果您的活动需要 10 秒才能执行或休眠,则运行时对此无能为力。但它不会安排任何新活动,因为没有剩余时间,而是会抛出 TimeoutException。

通常,当您进行长时间运行的工作时,您将使用异步活动,即 AsyncCodeActivity 或带有书签的 NativeActivity,以便运行时处于控制状态并可以中止工作流。

于 2010-07-01T19:42:30.007 回答