0

2 つのタスクを並行して実行する必要があります。GUI にデータをロードします。それまでは、進行状況バーをユーザーの前で継続的に実行したいと考えています。BackgroundWorker を試しましたが、スレッド同期エラーが発生しています。誰かが私に同じことをするための他の最善の方法を提案できますか?

コード: backgroundWorker1 初期化:

        backgroundWorker1 = new BackgroundWorker();
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);

        if (backgroundWorker1.IsBusy != true)
        {
            backgroundWorker1.RunWorkerAsync();
        }

次の行でエラーが発生します:

    XmlDocumentHierarchy _remoteObj = new XmlDocumentHierarchy(comboBox2.Text, "username", "password");

は:

   "Cross-thread operation not valid: Control 'comboBox2' accessed from a thread other than the thread it was created on."
4

2 に答える 2

0

BackgroundWorker スレッドから GUI スレッドにアクセスする必要がある場合は、次のように GUI スレッドでメソッドを簡単に呼び出すことができます。

    public Form1()
    {
        InitializeComponent();

        Thread thr = new Thread(new ThreadStart(BackGroundThread));
        thr.Start();
    }

    void BackGroundThread() 
    {
        for (int i = 0; i < 100; i++) 
        {
            // The line below will be run in the GUI thread with no synchronization issues
            BeginInvoke((Action)delegate { this.Text = "Processed " + i.ToString() + "%"; });                
            Thread.Sleep(200);
        }
    }
于 2013-05-22T20:28:26.917 に答える