2017-01-31 11 views
-1

ブラウザコントロールがあるウィンドウがあります。誰かがウィンドウを閉じると、ブラウザコントロールを特定のURLに移動する必要があり、ブラウザの操作が終了した後でウィンドウを閉じる必要があります。UIスレッドで実行されているメソッドの実行を一時停止

ウィンドウが閉じられると、OnBeforeWindowClose(Eventargs e)メソッドが呼び出されます。それはUIスレッドがスリープ状態になりますので、

OnBeforeWindowClose(Eventargs e) 
{ 

// As soon as the URL property is set the browser control navigates to the URL 

URL = "new URL"; 

//I need to wait till the browser is done navigating. Based on the NavigationFinished property below 

} 

bool NavigationFinished {set; get;} 

私はThread.Sleepを使用することはできません。 NavigationFinisedがtrueになるまで、OnBeforeCloseの実行を一時停止する方法はわかりません。 UIスレッドをブロックすることなく

UPDATE:OnBeforeWindowCloseメソッドに次のループを追加するには、私のため

do 
     { 
      var dateTime = DateTime.Now.AddSeconds(2); 
      while (DateTime.Now < dateTime) 
      { 
       System.Windows.Forms.Application.DoEvents(); 
      } 
     } while (!NavigationFinished); 

を働いしかし、その代わりに.NET 4.0

+0

あなたは 'await'を探しています。 – SLaks

+0

それは.net 4.0で利用できません:( – Kaddy

+0

NuGetに 'Microsoft.Bcl.Async'をインストールしてください。 – SLaks

答えて

0

でループを使用するのでは、これを行うには良い方法がある場合、私は思っていましたこれはやや難しいことですが、あなたの必要条件を満たすことができます:

  • Windowsの終了イベントを聞きます。
  • Windows_Closingハンドラは、ブラウザ現在のURLをチェックし実行しているとき:ウェブブラウザ上LoadCompletedへ
  • https://msdn.microsoft.com/en-us/library/system.windows.window.closing(v=vs.110).aspxを参照)、それは「新URL」でないならば、closingイベントをキャンセルし次のフックをしてから、ブラウザのURLを設定しますLoadCompletedハンドラがヒットしたときに、再度Windows.Close()メソッドを呼び出します(closeメソッドが再び実行されるときにブラウザURLがすでに「新しいURL」に設定されている場合は、再度LoadCompletedからアンフックできます)。

ここでは、取り消しによって一時停止を達成するという考えは、何かをしてから、プログラム的に再閉路します。

+0

ウィンドウのクローズは実際にはアプリケーションのクローズから呼び出されますが、アプリケーションクローズメソッドを呼び出すことはできません。 onBeforeCloseメソッドを途中で使用し、ブラウザがナビゲートした後に再開します。 – Kaddy

関連する問題