OSDN Git Service

WaitOne時に状態が入れ違いになり無限ループになるケースがある不具合を修正。
authorくまかみ工房 <kumakamikoubou@gmail.com>
Sun, 2 Oct 2016 06:09:35 +0000 (15:09 +0900)
committerくまかみ工房 <kumakamikoubou@gmail.com>
Sun, 2 Oct 2016 06:09:35 +0000 (15:09 +0900)
FDK24/同期/TriStateEvent.cs

index 0a15763..f12d917 100644 (file)
@@ -67,10 +67,15 @@ namespace FDK.同期
                /// <returns>解除後の状態(ON または 無効)。</returns>
                public 状態種別 ONになるまでブロックする()
                {
-                       if( 状態種別.無効 == this.状態 )
-                               return 状態種別.無効; // すでに無効なら速攻で帰る。
+                       if( 状態種別.無効 == this.状態 || 状態種別.ON == this.状態 )
+                               return this.状態;
 
-                       this.ONイベント.WaitOne();
+                       // 上の if から 下の WaitOne までの間に ON になった場合に備えて、定期的に状態をチェックする。
+                       while( false == this.ONイベント.WaitOne( 100 ) )
+                       {
+                               if( 状態種別.ON == this.状態 )
+                                       break;
+                       }
                        return this.状態;
                }
                /// <summary>
@@ -79,10 +84,15 @@ namespace FDK.同期
                /// <returns>解除後の状態(OFF または 無効)。</returns>
                public 状態種別 OFFになるまでブロックする()
                {
-                       if( 状態種別.無効 == this.状態 )
-                               return 状態種別.無効;// すでに無効なら速攻で帰る。
+                       if( 状態種別.無効 == this.状態 || 状態種別.OFF == this.状態 )
+                               return this.状態;
 
-                       this.OFFイベント.WaitOne();
+                       // 上の if から 下の WaitOne までの間に OFF になった場合に備えて、定期的に状態をチェックする。
+                       while( false == this.OFFイベント.WaitOne( 100 ) )
+                       {
+                               if( 状態種別.OFF == this.状態 )
+                                       break;
+                       }
                        return this.状態;
                }
                /// <summary>
@@ -90,8 +100,15 @@ namespace FDK.同期
                /// </summary>
                public void 無効になるまでブロックする()
                {
-                       if( 状態種別.無効 != this.状態 )
-                               this.無効イベント.WaitOne();
+                       if( 状態種別.無効 == this.状態 )
+                               return;
+
+                       // 上の if から 下の WaitOne までの間に無効になった場合に備えて、定期的に状態をチェックする。
+                       while( false == this.無効イベント.WaitOne( 100 ) )
+                       {
+                               if( 状態種別.無効 == this.状態 )
+                                       break;
+                       }
                }
 
                protected 状態種別 bs_状態 = 状態種別.OFF;