1

別のスレッドで独自のクラスを実行したいのですが、そうすると、たとえば、 の中でラベルを使用できなくなります。どうすればそれEventHandlerを回避できますか?

それが私のコードの外観です:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Ts3_Movearound
{
    public partial class Form1 : Form
    {
        TS3_Connector conn = new TS3_Connector();
        Thread workerThread = null;
        public Form1()
        {
            InitializeComponent();
            conn.runningHandle += new EventHandler(started);
            conn.stoppedHandle += new EventHandler(stopped);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //System.Threading.Thread connw = new System.Threading.Thread(conn);
            workerThread = new Thread(conn.Main);
            workerThread.Start();
        }

        public void started(Object sender, EventArgs e)
        {
            label1.Text = "Status: Running!";
        }
        public void stopped(Object sender, EventArgs e)
        {
            label1.Text = "Status: Stopped!";
        }
    }
}

そして、それがエラーです:

InvalidOperationExpetion 行 "label1.Text = "Status: Running!";"

4

3 に答える 3

5

UI スレッドを介してのみコントロールを更新できます。これを行うには、label1.Invoke() を使用します。

label1.Invoke((MethodInvoker)delegate {
    label1.Text = "Status: Running!";"
});
于 2012-10-30T09:23:34.013 に答える
1

これにはBackgroundWorkerの使用を検討します。次に、以下を使用します。

1) RunWorkerAsync を呼び出す前に、スレッドの問題がないため、ラベルを running に設定します。2) コントロールの使用を設定した場合、RunWorkerAsync を呼び出した後:

            label1.Invoke(new Action(() => label1.Text = @"Status: Running!"));

3) プロセスが終了したら、メソッドを RunWorkerCompleted イベントに割り当てることで、ラベルを停止に設定できます。このメソッドはメイン スレッドで実行されるため、スレッドの問題は発生しません。

于 2012-10-30T10:10:04.503 に答える
0

SOにはそれに関する多くのデータがあります。私はあなたのためにいくつかを見つけました:

別のスレッドから UI 要素にアクセスできますか? (設定されません)

別のスレッドで GUI 要素にアクセスするにはどうすればよいですか?

WPFのBackgroundWorkerスレッドからUIスレッドに直接アクセスするには?

于 2012-10-30T09:24:21.117 に答える