积极答复者
为何“状态机”的HandleExternalEvent事件无法触发?

问题
-
大家好,我初学WF,创建了状态机一个WorkFlow,宿主是一个控制台程序,代码如下:
namespace WorkFlowStateConsoleApp { class Program { static void Main(string[] args) { using (WorkflowRuntime runtime = new WorkflowRuntime()) { AutoResetEvent flag = new AutoResetEvent(false); WorkflowInstance instance = runtime.CreateWorkflow(typeof(CSharpStateWorkFlow.ShoppingWorkState)); ActivityInterface impl = new InterfaceImpl(); ExternalDataExchangeService ec = new ExternalDataExchangeService(); runtime.AddService(ec); ec.AddService(impl); runtime.StartRuntime(); instance.Start(); flag.WaitOne(); } } } }
接口和实现类定义如下:
接口:
namespace CSharpStateWorkFlow.ActivityInterfaces { [ExternalDataExchange] public interface ActivityInterface { event EventHandler<ExternalDataEventArgs> OnMenuShow; void MenuShow(); } }
实现类:
namespace CSharpStateWorkFlow.ImpleActivityInterfaces { public class InterfaceImpl:ActivityInterfaces.ActivityInterface { public event EventHandler<System.Workflow.Activities.ExternalDataEventArgs> OnMenuShow; public void MenuShow() { if (OnMenuShow != null) { OnMenuShow(null, null); } } } }
ChooseItemEvent包含一个handleExternalEventAcivity对象,其中这样绑定:
结果控制台只运行“请输入钱”,我输入了1000,回车结果什么也没有了……。
为何自定义的事件代码(在控制台程序中)不触发了呢?谢谢!
答案
-
Hi,
我注意到在你的InterfaceImpl实现里,OnMenuShow事件是需要ShowMenu方法来触发的。并且在工作流定义中,进入到Shopping State之后,工作流会等待外部事件触发。
但是没有看到任何地方去调用ShowMenu或者用其他形式来触发OnMenuShow,那么工作流就会卡在Shopping State的第一步。
My blog: http://coding.windstyle.cn
- 已标记为答案 Windie Chai [MVP]Moderator 2013年7月9日 7:05
全部回复
-
stateInitializationActivity1展开:
ChooseItemEvent展开:
全部代码:
namespace CSharpStateWorkFlow { public partial class ShoppingWorkState : StateMachineWorkflowActivity { public Dictionary<int, double> items = new Dictionary<int, double>(); public double Money { get; set; } public int ItemId { get; set; } public bool IsContinue { get; set; } private void InitMoney(object sender, EventArgs e) { Console.WriteLine("请添加钱:"); Money += double.Parse(Console.ReadLine()); } private void ReAddMoney(object sender, EventArgs e) { Console.WriteLine("加入的钱不足,请重新添加!"); Money += double.Parse(Console.ReadLine()); } private void ChooseItem(object sender, EventArgs e) { Console.WriteLine("请购物:"); ItemId = int.Parse(Console.ReadLine()); Money -= items[ItemId]; Console.WriteLine("您的剩余金额:" + Money); } private void ContinueIncreaseMoney(object sender, EventArgs e) { Console.WriteLine("是否继续?"); string flag = Console.ReadLine(); flag = flag.Trim(); IsContinue = (flag == "Y" || flag == "y"); } } }
-
你可以参考下这个帖子的方法。
Molly,
Please Mark as the Answer, if this answers your question. Please vote as helpful, if this post is helpful. -
你可以参考下这个帖子的方法。
对不起,首先我没有能够看懂你的意思。
按照我的理解,handleExternalEvent照例只要你定义接口和事件,并且绑定到这个Activity中去的时候,应该轮到这个Activity执行的时候,应该它会自动触发事件的。
这个是一个Bug还是?可以详细说明我代码中如何修改吗?谢谢了
-
- 已编辑 ThankfulHeart 2013年2月1日 8:32
-
Hi,
我注意到在你的InterfaceImpl实现里,OnMenuShow事件是需要ShowMenu方法来触发的。并且在工作流定义中,进入到Shopping State之后,工作流会等待外部事件触发。
但是没有看到任何地方去调用ShowMenu或者用其他形式来触发OnMenuShow,那么工作流就会卡在Shopping State的第一步。
My blog: http://coding.windstyle.cn
- 已标记为答案 Windie Chai [MVP]Moderator 2013年7月9日 7:05