如何检查以前 运行 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);
}
这是一个场景,它是一个 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);
}