如何检查以前 运行 ProgressChanged 是否已在 c# 的 DoWork 事件中完成

How can I check if previously running ProgressChanged has finished in DoWork event in c#

这是一个场景,它是一个 winforms 应用程序,我在其中 运行 在 Backgroundworker class 的 DoWork 事件中的 for 循环中一个一个地收集进程.我在 for 循环中定期调用 ReportProgress() 来更新 UI.

现在,当我调用 ReportProgress() 时,它会触发 ProgressChanged 事件,其中我有代码可以使用我之前在 DoWork 中设置的所有消息来更新 UI。但是由于这个 运行s 在一个单独的线程中,控制在 DoWork 中并行进行,但我想 hold/wait for 循环一段时间直到之前的 运行ning ProgressChanged 事件。

目前,我在 for-loop 中调用 Thread.Sleep(1000),然后再执行其中的任何操作(比如选择下一个进程并 运行ning 它),此代码给出我想要的输出。所以我只是想检查是否有任何替代解决方案(我不使用 Thread.Sleep 代替)我可以验证/等待 for 循环,直到之前的 运行ning ProgressChanged 事件完成它的工作,然后我才继续 运行 for 循环中集合的下一个过程。

在不解决整体设计问题的情况下,您的方法是使用 semaphore。最基本的例子是:

static Semaphore _semaphore = new Semaphore(0,1);
WorkStatus _workStatus;

void DoWork()
{
    _semaphore.WaitOne();
    try
    {
        _workStatus = Foo();  //Only one thread will be able to execute this at a time
    }
    finally
    {
        _semaphore.Release();
    }
}

void HandleProgressChanged()
{
    _semaphore.WaitOne(); //Wait for any DoWork threads to finish
    try
    {
        DisplayProgress(_workStatus);
    }
    finally
    {
        _semaphore.Release();
    }
    Task.Run(DoWork);
}