【问题标题】:Does BackgroundWorker.ReportProgress hold the BackgroundWorker_DoWork thread?BackgroundWorker.ReportProgress 是否持有 BackgroundWorker_DoWork 线程?
【发布时间】:2011-07-30 02:20:33
【问题描述】:

我正在使用 BackgroundWorker 来触发一个线程,然后调用一个函数,该函数又通过 .ReportProgress() 调用 Backgroundworker_ProgressChange;

在 ProgressChange 中,我正在尝试使用通过传递的对象接收到的一些信息将条目写入日志文件。

我可以假设 ProgressChange 实际上拥有 BackgroundWorker 线程吗?还是我会错过日志中的一些数据?

具体来说,我有 ProgressChange 将项目添加到列表框。有条件地,如果 listbox.items.count > 15,我想枚举 listbox.items 并将它们写入日志文件。

我对解决方案很灵活。列表框不“错过”条目不是强制性的。

谢谢,

马特

【问题讨论】:

    标签: c# listbox backgroundworker


    【解决方案1】:

    Afaik ProgressChanged 操作已发布,因此 DoWork 不必等待。但这对你写作活动有什么影响?

    进度更新将按顺序进行,它们不会(不能)相互打断。请注意不要让它们太慢。

    【讨论】:

    • 好吧,写一个文件可能是最慢的操作。 “已发布 ProgressChanged 操作”是指他们排队吗?如果是这样,在哪里(它在哪里占用内存)?我找不到这方面的文档。在与这里的开发人员(我是一名分析师/系统和网络人员)进行审查之后,很明显,依靠“ProgressChanged 队列”来保存我提供的任何数据都会造成增长问题太可怕。我只会用一维数组来保存,然后每50个左右刷新到日志文件。
    • 我认为这里有几条电线交叉。 Bgw 及其进度报告旨在与 GUI 一起使用 - 更新列表框等。您正在写入文件的部分可以在 DoWork 线程中内联完成,也可以在具有 ThreadPool 或 TPL 的另一个线程上完成。但是让它成为线程安全的应该是你主要关心的问题,而不是数据的大小。
    • 我创建了一个结构,然后创建了一个该结构的列表来存储值。检查列表的计数,我将以给定的计数写入文件。您的回复表明我可以在另一个线程中生成此“写入文件”操作,但您担心这会导致某种队列本身。因此,什么最安全的机制来避免这种情况,少写我自己的队列处理程序?我不应该保持简单,而是让一个线程执行并保存文件吗? (免责声明:我是编程新手,刚刚读过线程安全)
    • 这与原始问题相差很远。也许在一个新问题中描述你需要什么。尝试隔离问题。
    • 感谢您的帮助亨克。似乎有很多关于线程安全和文件打开问题的深入讨论。这是一个:stackoverflow.com/questions/256517/…
    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多