2016-12-29 4 views
-2

に起動しません。その基本は以下の通りです。コンソールアプリケーションが起動すると、別のスレッドを停止して強制終了する前に、Webページに移動して(最終的に処理を行う)スレッドを開始する必要があります。併せて、メインアプリケーションは、アプリケーションが終了するまでユーザーにメニューを提供するだけです。結局それは定期的にしょっちゅう呼び出されるように、ナビゲーションスレッドが別のメソッドに入れられますが、これはこの質問に関連してはならない、私は考えていない...スレッドは、私は、次の未完成のコードで実行するスレッドを取得しようとしていますC#コンソールアプリケーション

私の理解では、別のスレッドがすべきことですメインコンソールアプリケーションと並行して実行し、コンソールを終了すると終了します。 実際にどのように見えるかは、browser_DocumentCompletedイベントのトリガによって応答が得られなかったためです(私がチェックしたように、IPアドレスは生きていてアクティブであることを知っています!!)

誰かが別のスレッドが実行されていない、またはそうでないように見える理由を誰にも明らかにすることができますか?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Windows.Forms; 

namespace ConsoleThreadTest 
{ 
class Program 
{ 
    public delegate void Callback(string Status); 

    static void Main(string[] args) 
    { 

     NavigateToIPAddress GEIPA = new NavigateToIPAddress(new Uri("http://192.168.1.254"), new Callback(ResultCallback)); 
     Thread PerformThreadTask = new Thread(new ThreadStart(GEIPA.PerformThreadTask)); 
     PerformThreadTask.SetApartmentState(ApartmentState.STA); 
     PerformThreadTask.Start(); 

     Console.WriteLine("{0}","Press escape key to exit"); 

     while (true) 
     { 
      if (Console.KeyAvailable) 
      { 
       ConsoleKeyInfo key = Console.ReadKey(true); 
       switch (key.Key) 
       { 
        case ConsoleKey.Escape: 
         //Kill off thread if it is still running. 
         if (PerformThreadTask.ThreadState == ThreadState.Running) 
         { 
          PerformThreadTask.Abort(); 
         } 
         Environment.Exit(0); 
         break; 
        default: 
         break; 
       } 
      } 
     } 

    } 

    public static void ResultCallback(string Status) 
    { 
     Console.WriteLine("{0}\t{1}", DateTime.Now.ToString("h:mm:ss"), Status); 
    } 

    public class NavigateToIPAddress 
    { 
     private Uri WebAddress; 
     private bool WebBrowserNavigationComplete = false; 

     // Delegate used to execute the callback method when the task is complete. 
     private Callback callback; 

     // The constructor obtains the state information and the callback delegate. 
     public NavigateToIPAddress(Uri IPAddressToNavigateTo, Callback callbackDelegate) 
     { 
      WebAddress = IPAddressToNavigateTo; 
      callback = callbackDelegate; 
     } 

     // The thread procedure performs the task and then invokes the callback delegate with the status. 
     public void PerformThreadTask() 
     { 
      var br = new WebBrowser(); 
      br.DocumentCompleted += browser_DocumentCompleted; 
      try 
      { 
       br.Navigate(WebAddress); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("{0}\tSome error occurred: {1}", DateTime.Now.ToString("h:mm:ss"), e.Message); 
      } 

      Application.Run(); 

      while (WebBrowserNavigationComplete == false) 
      { 
      } 

      if (callback != null) 
       callback("Summit occurred"); 
     } 

     private void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      var br = sender as WebBrowser; 
      if (br.Url == e.Url) 
      { 
       Console.WriteLine("{0}\tNavigated to {1}", DateTime.Now.ToString("h:mm:ss"), e.Url); 
       WebBrowserNavigationComplete = true; 
      } 
     } 
    } 
} 
} 

ここではキャッチ22の状況があります。一方で、上記のように、私は、コードを残せば、application.run()方法後のものはWebBrowserNavigationCompleteフラグが変化することはありません意味し、コールバックが返されることはありませんどの実行されません。
しかし、私は、コードは、それがメッセージループは決してありませんように変更することはありませんWebBrowserNavigationCompleteフラグを待っているwhileループでスタックしているようapplication.run()を呼び出すために、この点に到達することはありませんapplication.run()

if (callback != null) 
    callback("Summit occurred"); 

後に移動した場合始めた!

私はこのような何かを行うことが第一だと考えていることはできませんか?このデッドロックを克服する通常の方法は何ですか?

おかげ

答えて

1

WebBrowserは、WinFormsの構築物であり、アプリケーションループはそれのためにメッセージを処理するように設定することが必要です。コンソールアプリケーションとメッセージループがないので、正しく機能しません。

新しいアプリケーションループを作成するには、Application.Run(STAスレッドから実行する必要があります)を明示的に作成する必要があります。

+0

大丈夫、提案に感謝します。上記のコードを編集し、 'Application.Run()'メソッドを追加しましたが、変更はなく、以前と同じように機能します。私はしかし、スレッド内の間違った場所にあると思っている?それはMSDNのWebサイト上のもの以外の多くの情報を見つけることができないようです! – cosmarchy

+0

@cosmarchy 'Application.Run'は、アプリケーションを終了するまで戻りません。アプリケーションを終了することはありません。したがって、決して返されず、それに続くコードは決して実行されません。 – Servy

+0

私はあなたがアプリケーションを終了するまでそれが戻ってこないことを理解していません。私はあなたがApplication.Run' '呼び出す – cosmarchy

関連する問題