如何从非创建的文本框中读取文本框?
问题描述:
我对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;
当我改变到eLog.Source =文本;我得到一个新的错误:使用未分配的局部变量'文本'。不是在invoke方法中分配文本? – Ironman 2013-02-23 09:18:16
编译器无法静态确定它被分配,所以它抱怨。只需将其声明为string text = string.Empty; – 2013-02-23 09:21:19
谢谢,这工作! – Ironman 2013-02-23 09:32:45