如何从非创建的文本框中读取文本框?

如何从非创建的文本框中读取文本框?

问题描述:

我对C#相当陌生,我写了几个函数式程序,但它们都是单线程应用程序。这是我的第一个多线程应用程序,我正在努力解决这个问题:“跨线程操作无效:控制'cbLogType'从一个线程访问,而不是它创建的线程”错误。我的应用程序在用户定义的事件日志源(cbLogType)中搜索Windows事件查看器以查找用户定义的事件ID。我正在使用backgroundworker进程完成所有工作,并且正在使用worker.reportprogress更新标签,但是,在调试时收到上述错误。我已经尝试了几个Invoke方法,但没有一个能够解决我的错误。我也尝试删除组合框并直接在代码中设置日志源,这在一定程度上起作用,但仍然失败。我已经包括我的代码和任何帮助将不胜感激。我怀疑我可能没有正确使用Invoke方法。提前致谢! CODE:如何从非创建的文本框中读取文本框?

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(); 
    } 

您正在访问非UI线程中的cbLogType。

更改为

eLog.Source = text; 
+0

当我改变到eLog.Source =文本;我得到一个新的错误:使用未分配的局部变量'文本'。不是在invoke方法中分配文本? – Ironman 2013-02-23 09:18:16

+0

编译器无法静态确定它被分配,所以它抱怨。只需将其声明为string text = string.Empty; – 2013-02-23 09:21:19

+0

谢谢,这工作! – Ironman 2013-02-23 09:32:45