2016-09-20 9 views
0

これは私が達成しようとしているものです。C#でWaitHandlesを使用したスレッド待機

私はログインクラスを持っています。ユーザーが認証されると、ログイン後の操作がスレッドで実行されます。ユーザーはホームページにアクセスします。

ここから私は別の機能に行きます。たとえばFindProductクラスです。私はログインスレッドのポストログイン操作が完了しているかどうか確認する必要があります。ログイン後の操作が完了した場合にのみ、私はその機能を入力することができます。

PerformLoginAsyncThreadとOnClickFindProductに待機ハンドルを配置する必要がありますか?

Class Login 
{ 
    public bool Login(Userinfo) 
    { 
     // do tasks like authenticate 
     if(authenticationValid) 
     { 
      PerformLoginAsyncThread(UserInfo) 
      //continue to homepage 
     } 
    } 

} 

Class HomePage 
{ 
    public void OnClickFindProduct 
    { 
    if(finishedPostLoginThread) 
     // proceed to Find Product page 
    else 
     { 
      //If taking more than 8 seconds, throw message and exit app 
     } 
    } 
} 
+4

私たちはこれに答えるために[mcve]を提供する必要があります。 – Enigmativity

+0

ホームログインページが読み込まれ、ポストログインコールが返ったときにのみ 'FindProduct'を有効にすると、ポストログイン操作を' Async-Await'呼び出しとして行うことができます。あなたのシステムに関する詳細を提供します。私はASP.Net MVCが 'Async'呼び出しを行うことができると仮定しています。この場合WaitHandlesを使用するとデッドロックにつながります。 –

+0

@MrinalKamboj問題は、私はC#2.0を使用しています。 2.0を必要とするレガシーシステムがたくさんあるので、私はアップグレードする選択肢がありません。私はそれが非同期であるかどうか疑いがあります。 問題は、私がスレッディングコンセプトに慣れていないということです。 :| – alfah

答えて

1

EventWaitHandleを使用する一般的な考え方は次のとおりです。作業を行う前にResetにする必要があります。完了したらSetしてください。

以下の例では、ResetEventプロパティを静的にしていますが、代わりにインスタンスを渡すことをお勧めします。

class Login 
{ 
    private Thread performThread; 
    public static ManualResetEvent ResetEvent { get; set; } 
    public bool Login(Userinfo) 
    { 
     // do tasks like authenticate 
     if(authenticationValid) 
     { 
      PerformLoginAsyncThread(UserInfo); 
      //continue to homepage 
     } 
    } 

    private void PerformLoginAsyncThread(UserInfo) 
    { 
     ResetEvent.Reset(); 
     performThread = new Thread(() => 
     { 
      //do stuff 
      ResetEvent.Set(); 
     }); 
     performThread.Start(); 
    } 
} 

class HomePage 
{ 
    public void OnClickFindProduct 
    { 
     bool finishedPostLoginThread = Login.ResetEvent.WaitOne(8000); 
     if(finishedPostLoginThread) 
     { 
      // proceed to Find Product page 
     } 
     else 
     { 
      //If taking more than 8 seconds, throw message and exit app 
     } 
    } 
} 
0

最も簡単な解決策は、ちょうど完了し、のためのあなたのOnClickFindProductチェック中にtrueにセッション変数を設定しPerformLoginAsyncThread関数内だろう待つか、イベントを発生させるあなたがあなたのロジックを複雑にしたくない場合セッション変数。

関連する問題