![](/img/trans.png)
[英]How do I use the WebClient progresschanged event from within backgroundworker dowork event?
[英]How can I check if previously running ProgressChanged has finished in DoWork event in c#
這是一個場景,它是一個winforms應用程序,其中有一組進程,這些進程在Backgroundworker類的DoWork事件中的for循環內逐個運行。 我在for循環中定期調用ReportProgress()以更新UI。
現在,當我調用ReportProgress()時,它會觸發ProgressChanged事件,在該事件中,我具有使用我先前在DoWork中設置的所有消息來更新UI的代碼。 但是由於它在單獨的線程中運行,因此控件在DoWork中並行運行,但是我想將for循環保持/等待一段時間,直到之前運行的ProgressChanged事件為止。
當前,我在for循環中調用Thread.Sleep(1000),然后在其中執行任何操作(例如拾取下一個進程並運行它),並且這段代碼為我提供了所需的輸出。 所以我只想檢查是否有其他解決方案(我不使用Thread.Sleep),我可以驗證/等待for循環,直到先前運行的ProgressChanged事件完成其工作為止,然后我繼續在for循環中運行集合中的下一個進程。
在不解決總體設計問題的情況下,使用信號量是實現此目的的方法。 最基本的示例是:
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.