0

私は、 1つのフォームといくつかのテキストボックス/ラベルを備えた通常のC#Windowsフォームアプリケーションを独自のスレッドで実行しています(私が理解しているように)。(Win 7 64 / VS 2008 / ネット 2)。

ここで、ベース アプリケーションが最初のスレッドにとどまっている間に、2 番目のスレッドを開始したいと考えています。2 番目のスレッドは、情報が 2 番目のスレッドによって取得される間、ユーザーがまだ TextBoxes に入力できる間に、いくつかのシステム情報を取得し、それをラベルに入力します。したがって、情報の取得が完了するまでユーザーが待つ必要がなく、その間にメインアプリケーションがハングしないという利点があります。

Form_Shown イベントで開始する 2 番目のスレッドでこのコードを実行するとします。

 Label1.Text = GetInternetIP();
 try
 {
 Label2.Text = System.Net.Dns.GetHostEntry(Label1.Text).HostName.ToString();
 }
 catch{MessageBox.Show("Fatal Error."); Process.Start("shutdown.exe", "-r -t 2"); this.Activate(); SendKeys.Send("%{F4}");}

「新しいスレッド」を設定する方法の詳細な説明に感謝します。私は初心者ですが、何か新しいことを学び、最初のアプリケーションを最適化 (高速化) したいと考えています。

Label1 と Label2 は、メイン フォーム (Form1) のメイン スレッドにあります。そこで、取得した情報を取得する必要があります。

4

4 に答える 4

0

私が受け取った 3 つの回答は、私をどこにも連れてこなかったか、うまくいかなかったので、ずっと後になって自分でそれを発見しました。Backgroundworker の "Completed" イベントで、UI にアクセスし、アプリケーションに添付されたフォームに情報を転送できます。UI がその 2 番目のスレッドでロックされている場合、2 番目のスレッドに何が役立つので、Backgroundworker が最適であり、自明です。

于 2013-12-08T02:43:23.977 に答える
0

バックグラウンド スレッドからメイン スレッドにあるユーザー コントロールにアクセスするには、入力するコントロールに対して BeginInvoke を使用するだけです。これは、その方法とその裏技を完全に説明する記事です。

http://weblogs.asp.net/justin_rogers/pages/126345.aspx

于 2013-10-19T18:46:10.757 に答える
0

別のスレッドで実行されているコードから UI コンポーネントにアクセスしないでください。実際、明示的にスレッドセーフでない限り (またはスレッドセーフな方法でアクセスしない限り)、複数のスレッドから何かにアクセスするべきではありません。

あなたの例では、時間がかかる情報を取得したいと言っています。あなたの場合、必要なプログラミングモデルは、メインスレッドに非同期関数を呼び出してその情報を取得させることであり、情報の準備ができたらメインスレッドに通知する必要があります。

C# でマルチスレッド プログラミングを実装するにはさまざまな方法がありますが、1 つの例を次に示します。

public Task<IPAddress> GetInternetIP()
{
    return Task.Factory.StartNew(() =>
    {
        IPAddress ip;

        // do some work to get the IPAddress

        return ip;
    });
}

private void Form_Load(object sender, EventArgs e)
{
    GetInternetIP().ContinueWith(ip =>
    {
        Label1.Text = ip.ToString();
    }, TaskScheduler.FromCurrentSynchronizationContext());
}

この場合、あなたがしているのはSystem.Threading.Tasks.Task、マルチスレッドを処理する a を実行することです。そして、現在のスレッドでメソッドを実行し続けるように指示しています。そのメソッドには、タスクの戻り値 (この場合は IPAddress オブジェクト) が渡されます。

于 2013-10-17T15:05:28.140 に答える
0

Windows フォームを処理する場合、UI は 1 つのスレッドでしか実行できません。その場合、バックグラウンド スレッドが作成され、バックグラウンド スレッドがデータを取得してから、それを単一の UI スレッドに渡します。これは、WPF での動作方法でもあります。

これを行う方法については、こちらをご覧ください

http://msdn.microsoft.com/en-us/magazine/cc300429.aspx

于 2013-10-17T14:44:29.787 に答える