Question

bananatoast on Fri, 18 Jan 2008 10:46:39


EventHandlingScopeActivityの振舞いについて、質問させてください。
EventHandlingScopeActivityは、子アクティビティの実行中にイベントを受け取り、ハンドラーの処理を実行するものだと思っています。たとえば、次のようなアクティビティA, B, Cがあり、BがEventHandlingScopeActivity(以下では[]で表現しています)の子アクティビティとします。このEventHandlingScopeActivityは、あるイベントevent1に反応するようにしています。

 

A → [ B ] → C

 

さて、Aが実行中のときにevent1が発生したとします。Bが実行中のときではありません。この場合、EventHandlingScopeActivityのイベントハンドラーは反応するのでしょうか?

 

http://msdn2.microsoft.com/ja-jp/library/ms734649.aspx を読む限り、Bが実行中のときしかイベントを受けないように思いましたが、試したところ、Aが実行中のときに投げたイベントも、Bがexecutingに遷移した際にハンドルしてしまいます。
これは仕様通りなのでしょうか?

 

なお、.NET3.5、VisualStudio2008にて確認しています。
試したxomlを以下に貼り付けます。

コード ブロック
<SequentialWorkflowActivity x:Class="Sample.Workflow1" x:Name="Workflow1" xmlns:x="http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml">http://schemas.microsoft.com/winfx/2006/xaml</A< A>>" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">
 <HandleExternalEventActivity'>http://schemas.microsoft.com/winfx/2006/xaml/workflow">http://schemas.microsoft.com/winfx/2006/xaml/workflow">
 <HandleExternalEventActivity x:Name="A" EventName="event2" InterfaceType="{x:Type Sample.IService}" />
 <EventHandlingScopeActivity x:Name="eventHandlingScopeActivity1">
  <HandleExternalEventActivity x:Name="B" EventName="event2" InterfaceType="{x:Type Sample.IService}" />
  <EventHandlersActivity x:Name="eventHandlersActivity1">
   <EventDrivenActivity x:Name="eventDrivenActivity1">
    <HandleExternalEventActivity Invoked="handleEvent2_Invoked" x:Name="handleCancel" EventName="event1" InterfaceType="{x:Type Sample.IService}" />
   </EventDrivenActivity>
  </EventHandlersActivity>
 </EventHandlingScopeActivity>
 <HandleExternalEventActivity x:Name="C" EventName="event2" InterfaceType="{x:Type Sample.IService}" />
</SequentialWorkflowActivity>

 

 

同様の問題をお持ちの方、何か情報をお持ちの方、よろしくお願いします。


Sponsored



Replies

bananatoast on Tue, 29 Jan 2008 10:32:46


USのフォーラムに聞いて回答がありましたので共有します。

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2740324&SiteID=1

 

試した例では、イベントハンドラーにHandleExternalEventActivityを使いました。 このアクティビティは、initializeのタイミングでQueueを登録します。つまり、EventHandlingScope が実行されるよりも前、CreateWorkflow されたときにはQueueができてしまうことによる現象でした。

 

解決案は、HandleExternalEventActivityのように、initializeでQueueを登録するアクティビティを使わずに、executeのタイミングでQueueを登録するアクティビティを使うこと。

たとえば、.NET3.5のReceiveActivityはexecuteのときにQueueを登録してるようです。