gpt4 book ai didi

c# - 使用线程 C#

转载 作者:太空狗 更新时间:2023-10-29 21:30:11 27 4
gpt4 key购买 nike

我需要一些帮助来弄清楚我做错了什么。我试图在一个单独的线程上从系统日志中获取项目集合,以防止表单在收集过程中被卡住。我可以让后台工作人员全部获取它们,但我在将它们添加到表单上的 ListBox 时遇到了一些问题。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{

foreach (System.Diagnostics.EventLogEntry entry in eventLog1.Entries)
{
listBox1.Items.Add(
entry.EntryType.ToString() + " - " +
entry.TimeWritten + " - " +
entry.Source);
}
}

显然,这并没有像预期的那样工作,因为有 2 个独立的线程,而且您不能更改不同线程上的对象,正如我所发现的那样。所以,如果有人能指导我正确的方向,我将不胜感激。

最佳答案

您不应从非 UI 线程访问 UI 元素。运行 ReportProgress,它将与 UI 线程同步。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
foreach (System.Diagnostics.EventLogEntry entry in eventLog1.Entries)
{
var newEntry = entry.EntryType + " - " + entry.TimeWritten + " - " + entry.Source;
backgroundWorker1.ReportProgress(0, newEntry);
}
}

void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
var newEntry = (string)e.UserState;
listBox1.Items.Add(newEntry);
}

确保启用 WorkerReportsProgress

backgroundWorker1.WorkerReportsProgress = true;

并订阅了 ProgressChanged

backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;

另一种方法是在内部调用Control.Invoke

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
foreach (System.Diagnostics.EventLogEntry entry in eventLog1.Entries)
{
var newEntry = entry.EntryType.ToString() + " - " + entry.TimeWritten + " - " + entry.Source;
Action action = () => listBox1.Items.Add(newEntry);
Invoke(action);
}
}

但使用这种方法,您不需要 BackgroundWorker,因为它的全部要点是使用同步的 ProgressChangedRunWorkerCompleted 事件处理程序使用 UI 线程。

关于c# - 使用线程 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6320680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com