1

私はC#にかなり慣れておらず、いくつかの機能するプログラムを作成しましたが、それらはすべてシングルスレッドアプリケーションです。これは私の最初のマルチスレッドアプリケーションであり、この「クロススレッド操作が無効です:作成されたスレッド以外のスレッドからアクセスされたコントロール'cbLogType'」エラーを解決するのに苦労しています。私のアプリケーションは、Windowsイベントビューアで、ユーザー定義のイベントログソース(cbLogType)でユーザー定義のイベントIDを検索します。私はすべての作業を行うためにbackgroundworkerプロセスを使用しており、ラベルを更新するためにworker.reportprogressを使用していますが、デバッグ時に上記のエラーが発生します。いくつかのInvokeメソッドを試しましたが、エラーを解決できるものはないようです。また、コンボボックスを削除し、コードで直接ログソースを設定しようとしましたが、ある程度は機能しますが、それでも失敗します。私は自分のコードを含めました。どんな助けでも大歓迎です。Invokeメソッドを正しく使用していない可能性があります。前もって感謝します!コード:

    private void bgWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        {
            if (File.Exists(@"C:\Events.log"))
                MessageBox.Show("File 'Events.log' already exists. All new data will be appended to the log file!", "Warning!");

            string message = string.Empty;
            string eventID = (tbEventID.Text);

            string text;

            EventLog eLog = new EventLog();
            Invoke((MethodInvoker)delegate() { text = cbLogType.Text; });
            eLog.Source = (this.cbLogType.Text); // I am receiving the error here
            eLog.MachineName = ".";

            int EventID = 0;
            string strValue = string.Empty;
            strValue = tbEventID.Text.Trim();
            //string message = string.Empty;

            EventID = Convert.ToInt32(strValue); // Convert string to integer

            foreach (EventLogEntry entry in eLog.Entries)
            {
                int entryCount = 1;
                if (cbDateFilter.Checked == true)
                {
                    if (entry.TimeWritten > dtPicker1.Value && entry.TimeWritten < dtPicker2.Value)
                        if (entry.InstanceId == EventID)
                            message = "Event entry matching " + (tbEventID.Text) + " was found in " + (cbLogType.Text);
                    using (StreamWriter writer = new StreamWriter(@"C:\Events.log", true))
                        writer.WriteLine("EventID: " + entry.InstanceId +
                            "\r\nDate Created: " + entry.TimeWritten +
                            "\r\nEntry Type: " + entry.EntryType +
                            "\r\nMachinename: " + entry.MachineName +
                            "\r\n" +
                            "\r\nMessage: " + entry.Message +
                            "\r\n");
                    if (entry.InstanceId != EventID)
                        message = "No event ids matching " + (tbEventID.Text) + " was found in " + (cbLogType.Text);
                }
                else
                {
                    if (cbDateFilter.Checked == false)
                    {
                        if (entry.InstanceId == EventID)
                            using (StreamWriter writer = new StreamWriter(@"C:\Events.log", true))
                                writer.WriteLine("EventID: " + entry.InstanceId +
                                    "\r\nDate Created: " + entry.TimeWritten +
                                    "\r\nEntry Type: " + entry.EntryType +
                                    "\r\nMachinename: " + entry.MachineName +
                                    "\r\n" +
                                    "\r\nMessage: " + entry.Message +
                                    "\r\n");
                        else if (entry.InstanceId != EventID)
                            message = "No event ids matching " + (tbEventID.Text) + " was found in " + (cbLogType.Text);
                    }
                    bgWorker1.ReportProgress((entryCount) * 10, message);
                    entryCount++;
                }
            }
        }
    }

    private void bgWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        lblStat.Text = e.UserState.ToString();
    }
4

1 に答える 1

2

UI以外のスレッドでcbLogTypeにアクセスしています。

への変更

eLog.Source = text;
于 2013-02-23T08:54:49.763 に答える